gpt4 book ai didi

java - obj.notify() 似乎不起作用

转载 作者:行者123 更新时间:2023-11-29 09:49:22 25 4
gpt4 key购买 nike

在我的 java 代码中,threadB 创建了 nb*threadA 并等待 myobj 的值等于 nbmyobj 最初等于 0,每个 threadA 递增它,当它变得等于 nb 最后一个 threadA 通知 ThreadB。

当运行程序时,threadB 没有收到通知并且不会继续运行。谁能告诉我这段代码的问题在哪里?

public class Myclass {
static Long myobj = new Long(0);
static int nb = 1;

public static void main(String[] args) {

ThreadA[] threadA = new ThreadA[nb];
ThreadB threadB = new ThreadB(threadA);
}
}

public class ThreadA extends Thread {
public ThreadA() {
this.start();
}

public void run() {
// do lot of computation
Myclass.myobj = Myclass.myobj + 1;
if (Myclass.myobj.intValue() == Myclass.myobj.nb) {
synchronized (Myclass.myobj) {
Myclass.myobj.notify();
}
}
}
}

public class ThreadB extends Thread {
ThreadA[] threadA;

public ThreadB(ThreadA[] threadA) {
this.threadA = threadA;
this.start();
}

public void run() {
for (int i = 0; i < threadA.length; i++) {
threadA[i] = new ThreadA();
}

synchronized (Myclass.myobj) {
while (Myclass.myobj.intValue() != Myclass.myobj.nb) {
Myclass.myobj.wait();
}
}
}
}

最佳答案

我对所有可能出错但并未导致问题的事情感到困惑。

真正的问题是

if (Myclass.myobj.intValue() == Myclass.myobj.nb)

永远不会是真的,因为每次调用 myobj <nb


我将如何编写这段代码?

int nb = ....

ExecutorService es = Executors.newFixedThreadPool(nb)
for (int i = 0; i < nb; i++)
es.submit(new Runnable() {
@Override
public void run() {
// do lot of computation
}
});
es.shutdown();
es.awaitTermination(1, TimeUnit.HOURS);

这里有太多需要改进的地方我觉得有必要列出来

  • 一定要使用正确的格式。
  • 提供可以编译的代码
  • 不要锁定可变字段。这不会达到您的预期,因为您每次都会锁定不同的对象。
  • 如果您打算使用 long,请不要使用 Long。在这种情况下,您似乎想要使用 int
  • 不要创建 new Long(0),因为您可以使用效率更高的自动装箱。如果您这样做,请不要将其用作要锁定的对象。
  • 不要在线程之间使用可变的 static 字段。
  • 不要扩展Thread。创建一个传递给线程的 Runnable。
  • 不要在构造函数中启动线程。
  • 不要使用数组将一个线程传递给另一个线程。尤其是在该线程启动后才会设置。
  • 仅读取/检查同步块(synchronized block)内的 protected 值。
  • 我不会使用一个线程来创建另一个线程,该线程被传递回原始线程。

但是,您的基本问题是您正在等待与您正在通知的对象不同的对象。

synchronized(Myclass.myobj){ // lock the object you might be waiting on.
Myclass.myobj=Myclass.myobj+1; // change this to another object.
Myclass.myobj.notify(); // notify a different object.
}

关于java - obj.notify() 似乎不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12599611/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com