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() {@Overridepublic 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() {@Overridepublic 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() {@Overridepublic void run() {System.out.println(Thread.currentThread().getName() + "等待获取锁");synchronized (lock) {System.out.println(Thread.currentThread().getName() + "获取锁");}}}).start();}}
stop会释放对象锁,可能会造成数据不一致。
文章转载自李二狗搞程序,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




