Java 线程 sleep wait 深入解析 Thread

来源:互联网 发布:不亦说乎的说的读音 编辑:程序博客网 时间:2024/06/05 02:41

wait 和 sleep 区别

  • sleep 是 Thread 的方法,wait 是 Object 的方法
  • sleep 不会释放锁,wait 会释放锁
  • sleep 是休眠,wait 是挂起
  • wait 唤醒需要用 notify 或者 notifyAll
  • 而 sleep 则是休眠一段时间自己就恢复
  • wait方法需要在synchronize块或者synchronize方法里调用,然而 sleep 不需要
  • 如果需要线程停顿,使用 sleep;使用 wait 进行线程间的通信( implement inter-thread communication use wait method)

wait的一半用法

private Object monitor = new Object();public void methodA(){    //需要获取 synchronize on the lock object     synchronized (monitor) {         //wait会释放当前的锁,把该线程加到the “wait list” associated with the lock object         monitor.wait();     }}

需求

两个线程,一个线程输出偶数,一个线程输出奇数,要求两个线程交替,得到1,2,3,4,5,6,7… 的效果
下面的代码注意是一个是

obj1.wait();obj1.notify();

另一个是

obj1.notify();obj1.wait();

这样就是A线程 wait,然后B线程唤醒notify A,B 自己 wait,然后A notify唤醒 B。
这样两个线程交替唤醒。

package a;public class EvenOddThreadTest {    /**     * @param args     */    static Object obj1 = new Object();    static Object obj3 = new EvenOddThreadTest();    public static void main(String[] args) throws InterruptedException {        new Thread() {            @Override            public void run() {                for (int i = 1; i < 21; i += 2) {                    synchronized (obj1) {                        try {                            obj1.wait();                        } catch (InterruptedException e) {                            // TODO Auto-generated catch block                            e.printStackTrace();                        }                        obj1.notify();                        System.out.println(i + Thread.currentThread().getName());                    }                }            }        }.start();        new Thread() {            @Override            public void run() {                for (int i = 2; i < 21; i += 2) {                    synchronized (obj1) {                        obj1.notify();                        try {                            obj1.wait();                        } catch (InterruptedException e) {                            // TODO Auto-generated catch block                            e.printStackTrace();                        }                        System.out.println(i + Thread.currentThread().getName());                    }                }            }        }.start();    }}

输出

1Thread-02Thread-13Thread-04Thread-15Thread-06Thread-17Thread-08Thread-19Thread-010Thread-111Thread-012Thread-113Thread-014Thread-115Thread-016Thread-117Thread-018Thread-119Thread-020Thread-1

参考文章

Difference between sleep() and wait()?

Difference between wait() and sleep() stackoverflow

Using wait/notify vs Thread.sleep() in Java QAT global

Difference between wait and sleep or difference between Sleep and yield in Java

0 0
原创粉丝点击