Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 等待和线程完全不同_Java_Multithreading - Fatal编程技术网

Java 等待和线程完全不同

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

我知道线程、睡眠和等待之间的区别

除了对象类中的wait和线程类中的sleep之外,它到底意味着什么? 有什么好的例子吗?

等待可以通过调用notify或notifyAll来唤醒。 在本例中,您可以看到Blah1没有等待1000毫秒,因为它被Blah2提前唤醒。等等

wait方法释放被给定线程阻塞的监视器。睡眠不会

可以通过调用中断方法来中断睡眠

输出:

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