Thread类当中sleep, join ,yield方法

时间:2021-12-18 23:31:18

    简述:线程类当中提供了一些辅助方法,以便我们在使用线程时,来完成不同的场景下的操作

    sleep()方法

    sleep 方法有个重载方法,sleep(long), sleep(long,int )

    sleep方法是让出CPU执行权,但是并不会释放到当前线程所拥有的锁对象,这个是和wait方法不同的地方。

    Thread.yield方法

        yield方法没有参数,是让出当前线程,让其他就绪的线程去执行,也不会保证当前线程立刻会停止,
        注:调用yield方法只是把当前线程放入到就绪队列中去,而不是阻塞队列,如果其他线程没有就绪状态,那么当前线程将会继续进行,yield可以让低于优先级的线程执行。
        yield并不能保证线程的交替进行

    Thread.join 方法

     join方法是父线程等待子线程执行结束,通俗点来讲就是,如果在线程A当中,调用线程B.join方法,那么线程A必须在等待线程B执行结束之后,才会接着往下执行。

public class JoinTest {
    public static void main(String[] args) throws Exception{
        Thread previous = Thread.currentThread();
        for(int i = 0; i < 10; i++) {
            Thread thread = new Thread(new Domino(previous),String.valueOf(i));
            thread.start();
            previous = thread;
        }
        TimeUnit.SECONDS.sleep(5);
        System.out.println(Thread.currentThread().getName()+" terminate.");
    }
    static class Domino implements Runnable{

        private Thread thread;
        public Domino(Thread thread) {
            this.thread = thread;
        }
        @Override
        public void run() {
            try{
                thread.join();
            }catch (Exception e){

            }
            System.out.println(Thread.currentThread().getName()+" terminate");
        }
    }
}

其执行结果是

main terminate.
0 terminate
1 terminate
2 terminate
3 terminate
4 terminate
5 terminate
6 terminate
7 terminate
8 terminate
9 terminate

Thread类当中对join的方法实现,其实是调用了wait方法

 public final synchronized void join(long millis)
    throws InterruptedException {
        long base = System.currentTimeMillis();
        long now = 0;

        if (millis < 0) {
            throw new IllegalArgumentException("timeout value is negative");
        }

        if (millis == 0) {
            while (isAlive()) {
                wait(0);
            }
        } else {
            while (isAlive()) {
                long delay = millis - now;
                if (delay <= 0) {
                    break;
                }
                wait(delay);
                now = System.currentTimeMillis() - base;
            }
        }
    }

在调用完wait方法之后,什么时候调用notify方法

这个是在jvm当中进行调用处理,当调用join的线程执行完之后,会自动唤醒主线程执行下去。