join
thread.join把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程。比如在线程B中调用了线程A的Join()方法,直到线程A执行完毕后,才会继续执行线程B。
// JoinTest.java的源码
public class JoinTest{
public static void main(String[] args){
try {
// 新建“线程t1”
ThreadA t1 = new ThreadA("t1");
// 启动“线程t1”
t1.start();
// 将“线程t1”加入到“主线程main”中,并且“主线程main()会等待它的完成”
t1.join();
System.out.printf("%s finish\n", Thread.currentThread().getName());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
static class ThreadA extends Thread{
public ThreadA(String name){
super(name);
}
public void run(){
System.out.printf("%s start\n", this.getName());
// 延时操作
for(int i=0; i <1000000; i++)
;
System.out.printf("%s finish\n", this.getName());
}
}
}
Join方法实现是通过wait(小提示:Object 提供的方法)。 当main线程调用t.join时候,main线程会获得线程对象t的锁(wait 意味着拿到该对象的锁),调用该对象的wait(等待时间),直到该对象唤醒main线程 ,比如退出后。这就意味着main 线程调用t.join时,必须能够拿到线程t对象的锁
yield
Thread.yield()方法作用是:暂停当前正在执行的线程对象,并执行其他线程。
结论:yield()从未导致线程转到等待/睡眠/阻塞状态。在大多数情况下,yield()将导致线程从运行状态转到可运行状态,但有可能没有效果。
结论
-
sleep() 使线程在一定的时间内进入阻塞状态,不能得到cpu时间,但不会释放锁资源。指定的时间一过,线程重新进入可执行状态
-
wait()使线程进入阻塞状态,同时释放自己占有的锁资源,和notify( )搭配使用
-
suspend() 使线程进入阻塞状态,并且不会自动恢复,必须其对应的resume( )被调用,才能使线程重新进入可执行状态
区别:
-
yield( ) 使得线程放弃当前分得的CPU时间,但是不使线程阻塞,即线程任然处于可执行状态,随时可能再次分得CPU时间。
-
其中sleep(),suspend(),rusume(),yield()均为Thread类的方法,wait()为Object类的方法