Java 如何对特定线程使用notifyAll?

Java 如何对特定线程使用notifyAll?,java,multithreading,eclipse,runnable,Java,Multithreading,Eclipse,Runnable,好的,这就是代码。它基本上有三个类。其中一个是增加一个值,另一个是减少一个无止境的循环。但是,当该值超过或低于特定限制时,它必须停止。但由于这两个函数都有notifyAll,因此它也会唤醒其他函数,因此即使处于极限,它也会继续运行。我怎样才能解决这个问题?提前谢谢 一级(增加和增加螺纹): 第二类(随Runnable递减): } 包含函数的第三类: import java.util.Random; public class Counter { private int counter; pri

好的,这就是代码。它基本上有三个类。其中一个是增加一个值,另一个是减少一个无止境的循环。但是,当该值超过或低于特定限制时,它必须停止。但由于这两个函数都有notifyAll,因此它也会唤醒其他函数,因此即使处于极限,它也会继续运行。我怎样才能解决这个问题?提前谢谢

一级(增加和增加螺纹):

第二类(随Runnable递减):

}

包含函数的第三类:

import java.util.Random;

public class Counter {

private int counter;
private Random ran;

public Counter() {
    //super();
    counter=0;
    ran= new Random();
}



public synchronized void increase() {
    int number=ran.nextInt(5);
    
    if(counter+number>=100 ) {
    
        System.out.println("Producer is stopping, value is: "+counter);
        System.out.println("The generated number is: "+number);
        try {
            wait();
        }
        catch (InterruptedException e) {
            // TODO: handle exception
            System.out.println("error in increasing mehtod"+e.getMessage());
        }

    }
    
    counter = counter+number;
    notifyAll();
    System.out.println("Prdoucer increase: "+counter);
}


public synchronized void decrease() {
    int number= ran.nextInt(5);
    if(counter-number<0) {
        System.out.println("Consumer is stopping, value is: "+counter);
        System.out.println("The generated number is: "+number);
        try {
            wait();
        }
        catch (InterruptedException e) {
            // TODO: handle exception
            System.out.println("error in decreasing mehtod"+e.getMessage());
        }
    }
    counter = counter-number;
    notifyAll();
    System.out.println("Consumer decrease: "+counter);
    
 }



}
import java.util.Random;
公共课柜台{
专用int计数器;
私用随机数;
公众柜位(){
//超级();
计数器=0;
ran=新随机数();
}
公共空间增加(){
int number=ran.nextInt(5);
如果(计数器+数字>=100){
System.out.println(“生产者正在停止,值为:“+计数器”);
System.out.println(“生成的编号为:“+number”);
试一试{
等待();
}
捕捉(中断异常e){
//TODO:处理异常
System.out.println(“增加方法中的错误”+e.getMessage());
}
}
计数器=计数器+数字;
notifyAll();
System.out.println(“计数器增加:+计数器”);
}
公共空间减少(){
int number=ran.nextInt(5);

if(counter number阅读关于虚假通知的信息。即使没有显式调用notify()/notifyAll(),线程也可以被通知。因此,在每次通知之后,线程必须检查它是否确实被通知,并准备好发现它被通知无效。

阅读关于虚假通知的信息。即使没有显式调用notify()也可以通知线程/notifyAll()。因此,在每次通知之后,线程必须检查它是否确实收到了通知,并准备好发现它收到了徒劳的通知

。如何对特定线程使用
notifyAll()

你没有。这不是
notifyAll()
的目的,也不是
notify()
的目的

您可以使用
notify()
和/或
notifyAll()
通知其他线程某些特定的事情已经更改或发生。当保证捕获通知的任何单个线程都能够处理更改或发生的任何事情时,您可以使用
notifyAll()
否则

在这两种情况下,调用方都不能指定应该通知哪些线程。如果调用
o.notify(),系统将随机选择在
o.wait()调用中等待的任何单个线程
对于同一个对象
o
,或者如果调用
o.notify()
,它将通知所有碰巧在
o.wait()
中等待的线程。当调用
o.notify()
o.notifyAll()
时,它不会对那些尚未在
o.wait()
中调用的线程执行任何操作

由您自己编写代码,充分利用这些功能发挥您的优势。关于如何做到这一点,有很多示例和教程。我个人最喜欢的是:


另请注意:正确使用
notify()
notifyAll()
有点棘手。正确编写代码对您来说很棘手,而对其他想要阅读和理解您的代码的人来说也很棘手

如果您认为需要<代码> NoTIFY()/代码>或<代码> NoTIFYAL()/代码>,首先要考虑是否可以使用封装Ent/Walk行为的更高级别的类。例如,对于“生产者/消费者”体系结构,您可以考虑使用.</P> 。如何对特定线程使用

notifyAll()

你没有。这不是
notifyAll()
的目的,也不是
notify()
的目的

您可以使用
notify()
和/或
notifyAll()
通知其他线程某些特定的事情已经更改或发生。当保证捕获通知的任何单个线程都能够处理更改或发生的任何事情时,您可以使用
notifyAll()
否则

在这两种情况下,调用方都不能指定应该通知哪些线程。如果调用
o.notify(),系统将随机选择在
o.wait()调用中等待的任何单个线程
对于同一个对象
o
,或者如果调用
o.notify()
,它将通知所有碰巧在
o.wait()
中等待的线程。当调用
o.notify()
o.notifyAll()
时,它不会对那些尚未在
o.wait()
中调用的线程执行任何操作

由您自己编写代码,充分利用这些功能发挥您的优势。关于如何做到这一点,有很多示例和教程。我个人最喜欢的是:


另请注意:正确使用
notify()
notifyAll()
有点棘手。正确编写代码对您来说很棘手,而对其他想要阅读和理解您的代码的人来说也很棘手

如果您认为需要<代码> NoTIFY()/代码>或<代码> NoTIFYAL()/代码>,您首先要考虑的是是否可以使用封装Ent/Bead行为的更高级别的类。例如,对于“生产者/消费者”架构,您可以考虑使用.< /P>当您使用WAITE()和NoTIFYAL()时,WAITE()方法应在循环中调用,并且只有当条件为false时,才应从循环中退出,否则应再次调用wait。您可以尝试将if从递增和递减方法更改为while,看看这是否解决了您的问题。使用wait()和notifyAll()时,wait()方法应该在循环中调用,并且应该退出

public class Consumer implements Runnable{

private Counter counter;

public Consumer(Counter counter) {
    // TODO Auto-generated constructor stub
    this.counter=counter;
}


@Override
public void run() {
    // TODO Auto-generated method stub
    //super.run();
    
    for(;;) {
        try {
            counter.decrease();
            
            Thread.currentThread().sleep(100);
        }
        catch (InterruptedException e) {
            // TODO: handle exception
            System.out.println("Consumer:"+e.getMessage());
        }
    }
    
}
import java.util.Random;

public class Counter {

private int counter;
private Random ran;

public Counter() {
    //super();
    counter=0;
    ran= new Random();
}



public synchronized void increase() {
    int number=ran.nextInt(5);
    
    if(counter+number>=100 ) {
    
        System.out.println("Producer is stopping, value is: "+counter);
        System.out.println("The generated number is: "+number);
        try {
            wait();
        }
        catch (InterruptedException e) {
            // TODO: handle exception
            System.out.println("error in increasing mehtod"+e.getMessage());
        }

    }
    
    counter = counter+number;
    notifyAll();
    System.out.println("Prdoucer increase: "+counter);
}


public synchronized void decrease() {
    int number= ran.nextInt(5);
    if(counter-number<0) {
        System.out.println("Consumer is stopping, value is: "+counter);
        System.out.println("The generated number is: "+number);
        try {
            wait();
        }
        catch (InterruptedException e) {
            // TODO: handle exception
            System.out.println("error in decreasing mehtod"+e.getMessage());
        }
    }
    counter = counter-number;
    notifyAll();
    System.out.println("Consumer decrease: "+counter);
    
 }



}