Java 等待和线程完全不同
我知道线程、睡眠和等待之间的区别 除了对象类中的wait和线程类中的sleep之外,它到底意味着什么? 有什么好的例子吗?等待可以通过调用notify或notifyAll来唤醒。 在本例中,您可以看到Blah1没有等待1000毫秒,因为它被Blah2提前唤醒。等等 wait方法释放被给定线程阻塞的监视器。睡眠不会 可以通过调用中断方法来中断睡眠 输出:Java 等待和线程完全不同,java,multithreading,Java,Multithreading,我知道线程、睡眠和等待之间的区别 除了对象类中的wait和线程类中的sleep之外,它到底意味着什么? 有什么好的例子吗?等待可以通过调用notify或notifyAll来唤醒。 在本例中,您可以看到Blah1没有等待1000毫秒,因为它被Blah2提前唤醒。等等 wait方法释放被给定线程阻塞的监视器。睡眠不会 可以通过调用中断方法来中断睡眠 输出: Blah1: Before notify Tue Jan 13 09:19:09 CET 2015 Blah1: Before wait Tue
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
在已同步的对象上调用wait,它将释放监视器并等待在同一对象上调用notify或notifyAll。它通常用于协调某些共享对象(如请求或连接队列)上的活动
睡眠不会释放任何监视器,也不会直接与其他线程交互。相反,它保留了所有监视器,只是暂时停止执行当前线程。Javadocs非常清楚这两者之间的区别。释放监视器是我在第一个回答中想到的:谢谢。我想我需要一些咖啡。睡眠也会被打断。
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