等待和线程完全不同

时间:2015-01-13 08:07:55

标签: java multithreading

我得到了 Thread.sleep()和wait()之间的区别。

The code sleep(1000); 
puts thread aside for exactly one second. 

The code wait(1000); 
causes a wait of up to one second.

除了wait之外,它究竟是什么意思在对象类中并在Thread类中休眠? 有没有好的例子?

2 个答案:

答案 0 :(得分:6)

您在已同步的对象上调用wait(),然后释放监视器并等待在同一对象上调用notify()notifyAll()。它通常用于协调某些共享对象上的活动,例如请求或连接队列。

sleep()不会释放任何监视器或以其他方式直接与其他线程交互。相反,它会保留所有监视器,并且只是稍微停止执行当前线程。

答案 1 :(得分:2)

调用wait()notify()可以唤醒

notifyAll()。 在这个例子中,你可以看到Blah1没有等待1000毫秒,因为它早先被Blah2唤醒了。 Blah2等待。

wait()方法发布监视器被给定线程阻止。 sleep()没有。

sleep()可以通过调用interrupt()方法来中断。

public class Blah implements Runnable {

    private String name;

    public Blah(String name) {
        this.name = name;
    }

    synchronized public void run() {
        try {
            synchronized (Blah.class) {
                System.out.println(name + ": Before notify " + new Date().toString());
                Blah.class.notifyAll();
                System.out.println(name + ": Before wait " + new Date().toString());
                Blah.class.wait(1000);
                System.out.println(name + ": After " + new Date().toString());
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        Thread th1 = new Thread(new Blah("Blah1"));
        Thread th2 = new Thread(new Blah("Blah2"));
        th1.start();
        th2.start();
    }
}

输出:

Blah1: Before notify Tue Jan 13 09:19:09 CET 2015
Blah1: Before wait Tue Jan 13 09:19:09 CET 2015
Blah2: Before notify Tue Jan 13 09:19:09 CET 2015
Blah2: Before wait Tue Jan 13 09:19:09 CET 2015
Blah1: After Tue Jan 13 09:19:09 CET 2015
Blah2: After Tue Jan 13 09:19:10 CET 2015