简述:线程类当中提供了一些辅助方法,以便我们在使用线程时,来完成不同的场景下的操作
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的线程执行完之后,会自动唤醒主线程执行下去。