Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.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:wait()不能释放锁。为什么?_Java_Java.util.concurrent - Fatal编程技术网

Java:wait()不能释放锁。为什么?

Java:wait()不能释放锁。为什么?,java,java.util.concurrent,Java,Java.util.concurrent,我的代码停在“producerstarted”处。为什么wait()不能释放锁?我在synchronized部分中使用了相同的对象,但它不起作用 class Processor { public void produce() throws InterruptedException { synchronized (this) { System.out.println("Producer started"); wait();

我的代码停在“producerstarted”处。为什么wait()不能释放锁?我在synchronized部分中使用了相同的对象,但它不起作用

class Processor {
    public void produce() throws InterruptedException {
        synchronized (this) {
            System.out.println("Producer started");
            wait();
            System.out.println("Producer ended");
        }
    }

    public void consume() throws InterruptedException {
        System.out.println("Consumer started");
        Scanner scanner = new Scanner(System.in);
        synchronized (this) {
            scanner.nextLine();
            System.out.println("go to producer");
            notify();
            Thread.sleep(1000);
            System.out.println("Consumer ended");
        }
    }
}
当我在不同的线程中运行这段代码时,我使用的是同一个处理器对象

public class Main {
    public static void main(String[] args) throws InterruptedException {
        Processor processor = new Processor();

        Thread t1 = new Thread(() -> {
            try {
                processor.produce();
            } catch (InterruptedException e) {}
        });

        Thread t2 = new Thread(() -> {
            try {
                processor.consume();
            } catch (InterruptedException e) {}
        });

        t1.run();
        t2.run();
        t1.join();
        t2.join();
    }
}
也许可以试试:

t1.start ();
t2.start ();
而不是

t1.run ();
t2.run ();
也许可以试试:

t1.start ();
t2.start ();
而不是

t1.run ();
t2.run ();

这里的问题是在线程上调用run()方法。如果要在单独的线程中运行start(),则应该使用start()

这里的问题是在线程上调用run()方法。如果要在单独的线程中运行start(),则应该使用start()