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 多线程通信为什么使用wait和notify不能保证输出 我期望以71001000乘法器的序列输出,有时显示,但有时不显示。我不明白等待和通知的用法出了什么问题。 T3(目标y){ 这个。t=y; } 公开募捐{ 对于(int i=0;i_Java_Multithreading - Fatal编程技术网

Java 多线程通信为什么使用wait和notify不能保证输出 我期望以71001000乘法器的序列输出,有时显示,但有时不显示。我不明白等待和通知的用法出了什么问题。 T3(目标y){ 这个。t=y; } 公开募捐{ 对于(int i=0;i

Java 多线程通信为什么使用wait和notify不能保证输出 我期望以71001000乘法器的序列输出,有时显示,但有时不显示。我不明白等待和通知的用法出了什么问题。 T3(目标y){ 这个。t=y; } 公开募捐{ 对于(int i=0;i,java,multithreading,Java,Multithreading,我认为我正确地使用了标志,但我想知道出了什么问题。notify()通知一个等待的线程。因此,在T1任务调用了notify()之后,T2或T3将被唤醒,并继续其任务 请注意,您没有循环检查条件。您正在使用if。因此,一旦线程重新启动,它就会退出if块并继续 顺便说一句,即使这是我们的意图,它也没有遵循中描述的规则:虚假的唤醒可能发生,wait应该总是在循环中调用,并在退出wait状态之前检查条件 所以 如果 使用notifyAll()而不是notify() Thxs很多。我同意第二点。但我在各自的

我认为我正确地使用了标志,但我想知道出了什么问题。

notify()
通知一个等待的线程。因此,在T1任务调用了
notify()
之后,T2或T3将被唤醒,并继续其任务

请注意,您没有循环检查条件。您正在使用
if
。因此,一旦线程重新启动,它就会退出if块并继续

顺便说一句,即使这是我们的意图,它也没有遵循中描述的规则:虚假的唤醒可能发生,wait应该总是在循环中调用,并在退出wait状态之前检查条件

所以

  • 如果
  • 使用
    notifyAll()
    而不是
    notify()

  • Thxs很多。我同意第二点。但我在各自的类中使用的循环是自己的。这不起作用。哇!!!在使用while循环代替If之后,我总是得到准确的答案。Thxs JB Nizet..但是我真的不明白为什么它不能与If一起工作。你能详细解释一下ifT1启动时gng有什么问题,并且不会因为twoFlag为false而被阻止吗。T2和T3被阻断。然后T1将threeFlag设置为true,并调用notify()。然后T2或T3被唤醒。你不能说。无论线程是什么,它都会退出等待调用,然后退出if,而不会再次检查if条件。
        package com.facebook.dao;
    
        public class ManyThreads {
    
            public static void main(String[] args) {
                // TODO Auto-generated method stub
                targets target = new targets();
    
                T1 x = new T1(target);
                T2 y = new T2(target);
                T3 z = new T3(target);
    
                Thread t1 = new Thread(x);
                Thread t2 = new Thread(y);
                Thread t3 = new Thread(z);
    
                t1.start();
                t2.start();
                t3.start();
            }
    
        }
    
       class targets {
            boolean twoFlag = false;
            boolean threeFlag = true;
            boolean fiveFlag = true;
            int i = 7, j = 100, k = 1000;
    
          public synchronized void twoMul() {
                if (twoFlag) {
                    try {
                        wait();
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
                System.out.println(i * 2);
                threeFlag = false;
                twoFlag = true;
                notify();
    
            }
    
            public synchronized void threeMul() {
    
                if (threeFlag) {
                    try {
                        wait();
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
                System.out.println(j * 3);
                fiveFlag = false;
                threeFlag = true;
                notify();
    
            }
    
            public synchronized void fiveMul() {
    
                if (fiveFlag) {
                    try {
                        wait();
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
                System.out.println(k * 5);
                twoFlag = false;
                fiveFlag = true;
                notify();
    
            }
    
        }
    
       class T1 implements Runnable {
            targets t;
    
            T1(targets y) {
                this.t = y;
            }
    
        public void run() {
                for (int i = 0; i < 3; i++) {
    
                    t.twoMul();
    
                }
            }
        }
    
        class T2 implements Runnable {
            targets t;
    
            T2(targets y) {
                this.t = y;
            }
    
            public void run() {
                for (int i = 0; i < 3; i++) {
    
                    t.threeMul();
    
                }
            }
        }
    
       class T3 implements Runnable {
            targets t;
    
            T3(targets y) {
                this.t = y;
            }
    
            public void run() {
                for (int i = 0; i < 3; i++) {
    
                    t.fiveMul();
    
                }
            }
        }