1. 线程让步: yield()
yield()的作用是让步. 它能让当前线程由 "运行状态" 进入到 "就绪状态", 从而让其它具有相同优先级的等待线程获取执行权; 但是, 并不能保证在当前线程调用 yield()之后, 其它具有相同优先级的线程就一定能获得执行权; 也有可能是当前线程又进入到 "运行状态" 继续运行!
2. yield() 与 wait()的比较
我们知道, wait()的作用是让当前线程由 "运行状态" 进入 "等待 (阻塞) 状态" 的同时, 也会释放同步锁. 而 yield()的作用是让步, 它也会让当前线程离开 "运行状态". 它们的区别是:
(1) wait()是让线程由 "运行状态" 进入到 "等待 (阻塞) 状态", 而不 yield()是让线程由 "运行状态" 进入到 "就绪状态".
(2) wait()是会线程释放它所持有对象的同步锁, 而 yield()方法不会释放锁.
3. 线程休眠: sleep()sleep() 定义在 Thread.java 中.
sleep() 的作用是让当前线程休眠, 即当前线程会从 "运行状态" 进入到 "休眠 (阻塞) 状态".sleep()会指定休眠时间, 线程休眠的时间会大于 / 等于该休眠时间; 在线程重新被唤醒时, 它会由 "阻塞状态" 变成 "就绪状态", 从而等待 CPU 的调度执行.
4. sleep() 与 wait()的比较:
我们知道, wait()的作用是让当前线程由 "运行状态" 进入 "等待 (阻塞) 状态" 的同时, 也会释放同步锁. 而 sleep()的作用是也是让当前线程由 "运行状态" 进入到 "休眠 (阻塞) 状态".
但是, wait()会释放对象的同步锁, 而 sleep()则不会释放锁.
5. sleep()与 yield()的比较:
sleep 和 yield 的区别在于, sleep 可以使优先级低的线程得到执行的机会, 而 yield 只能使同优先级的线程有执行的机会.
6. Object 中的 wait()和 notify()
使用注意事项:
因为 wait 需释放锁, 所以必须在 synchronized 中使用(没有锁时使用会抛出 IllegalMonitorStateException)
notify 也要在 synchronized 使用, 并且应该指定对象
synchronized(),wait(),notify() 对象必须一致, 一个 synchronized()代码块中只能有 1 个线程 wait()或 notify()
7.LockSupport 中的 park() 和 unpark()
总结一下, LockSupport 比 Object 的 wait/notify 有两大优势:
1LockSupport 不需要在同步代码块里 . 所以线程间也不需要维护一个共享的同步对象了, 实现了线程间的解耦. 说明: park 和 wait 的区别. wait 让线程阻塞前, 必须通过 synchronized 获
取 同步锁.
2unpark 函数可以先于 park 调用, 所以不需要担心线程间的执行的先后顺序.
8.join
等待该线程终止.
等待调用 join 方法的线程结束, 再继续执行. 如: t.join();// 主要用于等待 t 线程运行结束, 若无此句, main 则会执行完毕, 导致结果不可预测.
9.interrupt
interrupt 方法不会中断一个正在运行的线程. 就是指线程如果正在运行的过程中, 去调用此方法是没有任何反应的. 为什么呢, 因为这个方法只是提供给 被阻塞的线程, 即当线程调用了. Object.wait, Thread.join, Thread.sleep 三种方法之一的时候, 再调用 interrupt 方法, 才可以中断刚才的阻塞而继续去执行线程.
来源: http://www.bubuko.com/infodetail-2841806.html