sleep方法
- 调用 sleep 会让当前线程从 Running 进入TIMED_WAITING状态,不会释放对象锁
- 其它线程可以使用 interrupt 方法打断正在睡眠的线程,这时 sleep 方法会抛出 InterruptedException,并且会清除中断标志
- 睡眠结束后的线程未必会立刻得到执行
- sleep当传入参数为0时,和yield相同
yield方法
- yield会释放CPU资源,让当前线程从 Running 进入 Runnable状态,让优先级更高(至少是相同)的线程获得执行机会,不会释放对象锁;
- 假设当前进程只有main线程,当调用yield之后,main线程会继续运行,因为没有比它优先级更高的线程;
- 具体的实现依赖于操作系统的任务调度器
join方法
等待调用join方法的线程结束之后,程序再继续执行,一般用于等待异步线程执行完结果之后才能继续运行的场景。
public class ThreadJoinTest { public static void main(String[] sure) throws InterruptedException { Thread t = new Thread(new Runnable() { @Override public void run() { System.out.println("t begin"); try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("t finished"); } }); long start = System.currentTimeMillis(); t.start(); //主线程等待线程t执行完成 t.join(); System.out.println("执行时间:" + (System.currentTimeMillis() - start)); System.out.println("Main finished"); } }
stop方法
stop()方法已经被jdk废弃,原因就是stop()方法太过于暴力,强行把执行到一半的线程终止。
public class ThreadStopTest { private static Object lock = new Object(); public static void main(String[] args) throws InterruptedException { Thread thread = new Thread(new Runnable() { @Override public void run() { synchronized (lock) { System.out.println(Thread.currentThread().getName() + "获取锁"); try { Thread.sleep(60000); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println(Thread.currentThread().getName() + "执行完成"); } }); thread.start(); Thread.sleep(2000); // 停止thread,并释放锁 thread.stop(); new Thread(new Runnable() { @Override public void run() { System.out.println(Thread.currentThread().getName() + "等待获取锁"); synchronized (lock) { System.out.println(Thread.currentThread().getName() + "获取锁"); } } }).start(); } }
stop会释放对象锁,可能会造成数据不一致。