当前位置: 首页 > 知识库问答 >
问题:

实现Runnable而不是扩展Thread时的不同行为

凌和颂
2023-03-14
Calculator calc = new Calculator();
new ReadCalculation(calc).start();
new ReadCalculation(calc).start();
calc.start();
public class NotifyAllAndWait {

public static void main(String[] args) {

        Calculator calc = new Calculator();
        Thread th01 = new Thread(new ReadCalculation(calc));
        th01.start();
        Thread th02 = new Thread(new ReadCalculation(calc));
        th02.start();

        Thread calcThread = new Thread(calc);
        calcThread.start();
    }
}

class ReadCalculation implements Runnable {

    private Calculator calc = null;
    ReadCalculation(Calculator calc) {
        this.calc = calc;
    }

    @Override
    public void run() {
        synchronized (calc) {
            try {
                System.out.println(Thread.currentThread().getName() + " Waiting for calculation...");
                calc.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName() + " Total: " + calc.getTotal());
        }
    }
}

class Calculator implements Runnable {
    private int total = 0;
    @Override
    public void run() {
        synchronized(this) {
            System.out.println(Thread.currentThread().getName() + " RUNNING CALCULATION!");
            for(int i = 0; i < 100; i = i + 2){
                total = total + i;
            }
            notifyAll();
        }
    }
    public int getTotal() {
        return total;
    }
}

共有1个答案

闻人哲茂
2023-03-14

当执行wait()时,这需要在执行notify()块的状态更改之后进行循环。例如。

// when notify
changed = true;
x.notifyAll();

// when waiting
while(!changed)
    x.wait();

如果不这样做,您将遇到诸如wait()错误醒来或notify()丢失等问题。

注意:一个线程可以很容易地在其他线程开始之前完成100次迭代。预创建Thread对象可能会对性能产生足够的影响,从而改变您的情况下的结果。

 类似资料:
  • 我试图找出扩展Thread类的可能优势是什么? null

  • 问题内容: 我试图找出扩展Thread类的可能的优点是什么? 这是我描述的另一个问题的一部分:在Java中有两种创建线程的方法 从Thread类扩展 实现可运行的接口 如此处所述,使用可运行接口有许多好处。我的问题是从Thread类扩展的优点是什么?我想到的唯一好处是可以从Thread类扩展,并且可以称其为ThreadExtended类。然后,他/她可以在ThreadExtended中添加更多功能

  • 我希望有一个方法返回一个类 ,该类根据作业类型具有不同的方法。 例如,作业类型可以是 或 。它们不共享方法,但需要从单个方法getJob()中获取它们。 现在我有一个普通的类< code>job,它的方法返回< code>null,没有构造函数,因为我在< code>getJob()方法中构造了其他类(例如BackupJob或RunCommandJob)。 在返回单个类的同时获得不同工作类的最佳方

  • 问题内容: 我在python代码中发现了瓶颈,并与psycho等打交道。然后决定编写ac / c ++扩展以提高性能。 借助swig,您几乎不需要关心参数等。一切正常。 现在我的问题是:swig创建了一个很大的py文件,该文件在调用实际的.pyd或.so代码之前会执行很多“检查”和“ PySwigObject”。 你们中的任何人是否有经验,如果您手动编写此文件或让wig来做,是否可以获得更多性能。

  • 在Java,你可以做这样的事情: 在Kotlin有可能做同样的事情吗?假设是抽象的,并且不实现

  • 问题内容: 给定以下示例(将与匹配器结合使用): 这不能与以下内容的方法签名一起编译: 编译器错误消息是: 但是,如果我将方法签名更改为: 然后编译工作。 所以三个问题: 为什么当前版本完全不编译?尽管我在这里模糊地理解了协方差问题,但如果需要的话,我当然无法解释。 将方法更改为有什么缺点吗?如果这样做,还有其他情况会中断吗? 在中通用化方法有什么意义吗?该级似乎并不需要它,因为JUnit的调用方