wait()与sleep()区别、yield、join、线程停止(suspend和stop)
wait()与sleep()区别:
1、sleep是Thread类的静态办法,是线程用来控制本身流程,让当前线程休眠一段时间。不触及线程间的通讯
2、wait是Object的办法,并且必要放到同步块中,用于线程间的通讯。wait会开释锁,并且必要notify(或notifyAll)来叫醒,不然会不休处于壅闭形态。
wait和sleep都要捕捉特别
yield:
yield也是Thread的静态办法,yield的实质就是将当前线程重新放入抢占CPU时间的”行列“中,当前线程乐意让出CPU的使用权,可以让其他线程持续实行,但是线程调治器约莫会中止当前线程持续实行,也约莫会让该线程持续实行。 并且与线程优先级并无干系,优先级高的不一定先实行。线程的优先级将该线程的紧张性转达给线程调治器,调治器将倾向于让优先权最高的线程先实行.然后这并未料味值优先权较低的线程将得不到实行。优先级较低的线程仅仅是实行的频率较低。
总结一下:
1. 线程优先级并不克不及确保线程的实行排序,优先级高的并不一定先实行,优先级低的也不一定不实行
2. 不要试图使用优先级来控制线程的实行排序
调停优先级和使用yield只是增长了线程之间切换的几率罢了。yield相当于让线程从running态——>runnable形态
join:
join是让当前线程等候调用join 的线程运转完run办法,可以指定时间,若指定了时间,则等候指定时间,即使调用join的线程没运转完run办法,当前线程也会持续往下运转;若未指定时间,则当前线程不休等候,直到join的线程运转完run办法。给出一个例子就晓得了,代码如下
package java_IO;
public class joinTest {
public static void main(String[] args) {
Thread t=new Thread(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+" begins");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+" ends");
// TODO Auto-generated method stub
}
},"T");
t.start();
try {
t.join(1000);
if(t.isAlive()) {
System.out.println("t has not finished");
}
else {
System.out.println("t has finished");
}
System.out.println("JoinFinish");
} catch (Exception e) {
// TODO: handle exception
}
}
}
后果:
T begins
t has not finished
JoinFinish
T ends
若join未指定时间,则后果如下
停止线程
寻常直接让线程跑完run办法,它就会主动停止了,这是最好的一种办法。另有就是stop,调用stop则开释线程一切资源,但线程不一定实行完了,这种具有十分大的不确定性;另有一种就是调用suspend办法,这个办法容易形成死锁,如果该线程拿到了某个锁,suspend不会开释锁,以是这个办法也不保举。
专注于武艺抢手大数据,人工智能,JAVA、Python、 C 、GO、Javascript等言语最新弁言武艺,及业务痛点成绩分析,请眷注【编程我最懂】协同交换学习。