yield()
- 1.字面意思:投降,放弃
- 2.yield()方法的意思是告诉CPU执行其他的线程,当前线程让出CPU的执行权利
- 3.yield()方法不能保证使用当前正在运行的线程迅速转换到可运行的状态
- 4.yield()方法作用是将当前线程从执行中的状态转换到可执行状态
- 5.yield()方法不能保证其他线程一定能够执行,因为执行过yield()方法的线程当前依然是可执行状态,有可能被CPU再次执行
- 6.yield()方法的线程不会释放锁
join()
- 1.join()方法使得一个线程在另一个线程执行结束后再执行
- 2.如果join()方法在一个线程实例上调用,那当前运行着的线程将阻塞,知道这个线程执行完
- 3.可以设置超时时间
- 4.重载方法有join(long millis),join(long millis,int nanos)
- 5.超时后,主方法和任务线程申请运行的时候是平等的
- 6.jion()可以抛出InterruptedException对中断做出回应
package com.hexy.thread.demo;
public class ThreadDemo12 {
public static void main(String[] args) throws InterruptedException {
Thread thread2 = new Thread(()-> {System.out.println("Thread2 Completed");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
});
Thread thread1 = new Thread(()->{
try {
thread2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("thread1 started");
System.out.println("thread1 sleeping for 2s");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("thread1 completed");
});
thread1.start();
thread2.start();
}
}
sleep()/wait()/yield()/join()对比
- 1.Thread.sleep(long)和Thread.yield()都是Thread类的静态方法,join()是由线程对象来调用
- 2.sleep使线程从运行状态进入阻塞状态,超时后进入就绪态,是否进入运行态就要看操作系统的内部调用机制
- 3.如果Thread.sleep()/Thread.yield()使用在由syncronized锁定的代码块中,那么在调用他们的过程中,并不会释放锁,wait()方法会释放锁
- 4.join方法可以使一个线程在另一个线程执行结束后再执行
- 5.yield方法是让当前线程由运行状态进入就绪状态,然后让操作系统重新调度一次,这次调度只会让处于就绪队列中比当前线程优先级高或者相等的线程运行,很可能某个线程在调用yield后,又被操作系统调度进来运行
- 6.wait和notify,notifyAll用于协调多个线程对共享数据的存取,必须在syncronized语句块内使用这3个方法