多线程基础之join()&yield()

201 阅读2分钟

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类的方法

参考文章