java多线程:4、Java对多线程的支持(二)后台线程setDaemon、暂停线程yield
发布日期:2021-06-29 01:43:19 浏览次数:2 分类:技术文章

本文共 1936 字,大约阅读时间需要 6 分钟。

文章目录


上篇文章介绍了线程实现方式、线程的随机性,大家如需了解可参考 这篇我们来看看后台线程setDaemon、暂停线程yield

一、设置后台线程

t03_设置后台线程

MultiThread类

public class MultiThread {	public static void main(String[] args) {		MyThread mt = new MyThread();		mt.setDaemon(true);//在线程启动之前,标记为后台线程		mt.start();				int index = 0;		while(true){						if(index++ == 500)					break;//跳出循环				System.out.println("main:"+Thread.currentThread().getName());						}			}}

Main方法所在的线程是一个非后台的线程

mt.setDaemon(true);//在mt线程启动之前,标记为后台线程

然后启动:mt.start();

 

MyThread类

public class MyThread extends Thread {	@Override	public void run() {		while(true)		System.out.println(getName());	}}

 

打印结果

我们看一下当main方法所在的线程退出的时候,那么我们这个后台线程是否也跟着退出?

刚开始的时候是main方法所在线程和后台线程mt在交替运行,

当我们main方法所在线程终止的时候,那么这个后台线程mt也就跟着在后面终止了,不再循环执行啦!

 

二、yield方法,暂停线程让别的线程运行

一个正在执行的线程可以放弃它执行的权利,让另外一个线程开始运行,我们可以使用方法yield方法。

t04_yield方法暂停线程让别的线程运行

MultiThread类

public class MultiThread {	public static void main(String[] args) {		MyThread mt = new MyThread();		mt.setDaemon(true);//在线程启动之前,标记为后台线程		mt.start();				int index = 0;		while(true){						if(index++ == 500 )					break;							System.out.println("main:"+Thread.currentThread().getName());						}			}	}

MyThread类

public class MyThread extends Thread {	@Override	public void run() {				while(true){			System.out.println(getName());			yield();//暂停当前线程,让其他线程执行		} 			}}

这里就不截图了我们打印输出以后,可以看到每当我们打印mt线程名以后,因为调用了yield方法,让当前线程暂停了,

于是线程发生切换,轮到main方法所在的线程开始执行,当main方法所在线程运行到一段时间之后,

线程又切换到mt线程,当打印mt线程名以后,因为调用了yield方法,让当前线程暂停了,

线程又切换到main方法所在线程......

 

       Java线程中的Thread.yield( )方法,译为线程让步。顾名思义,就是说当一个线程使用了这个方法之后,它就会把自己CPU执行的时间让掉,让自己或者其它的线程运行,注意是让自己或者其他线程运行,并不是单纯的让给其他线程。

       yield()的作用是让步。它能让当前线程由“运行状态”进入到“就绪状态”,从而让其它具有相同优先级的等待线程获取执行权;但是,并不能保证在当前线程调用yield()之后,其它具有相同优先级的线程就一定能获得执行权;也有可能是当前线程又进入到“运行状态”继续运行!

      举个例子:一帮朋友在排队上公交车,轮到Yield的时候,他突然说:我不想先上去了,咱们大家来竞赛上公交车。然后所有人就一块冲向公交车,有可能是其他人先上车了,也有可能是Yield先上车了。

     但是线程是有优先级的,优先级越高的人,就一定能第一个上车吗?这是不一定的,优先级高的人仅仅只是第一个上车的概率大了一点而已,最终第一个上车的,也有可能是优先级最低的人。并且所谓的优先级执行,是在大量执行次数中才能体现出来的。 参考链接:

 

 

 

转载地址:https://blog.csdn.net/YuDBL/article/details/86085676 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:java多线程:5、Java对多线程的支持(三)线程优先级
下一篇:java网络编程:13、基于UDP的socket编程(三)实现相互发送接收消息

发表评论

最新留言

不错!
[***.144.177.141]2024年04月04日 10时05分35秒