gpt4 book ai didi

java - 第二个线程在 for 循环中不运行()

转载 作者:行者123 更新时间:2023-12-03 20:01:54 25 4
gpt4 key购买 nike

这是我为研究线程而创建的测试代码。它由分配给同一个 Runnable 的两个线程组成。他们必须将 5 减去 int,如果 int 不足以减去 5,则停止。事情是,线程 1“alpha”一直循环,直到它在循环的一半,在这种情况下为 5。然后线程 2“测试版”开始。这是一种我无法理解的奇怪行为。我错过了什么?

public class synconizedThread implements Runnable {

int balance = 100;

public void run() {

checkAmmount();
}

public void checkAmmount() {

synchronized (this) {
for (int i = 0; i < 10; i++) {

System.out.println(Thread.currentThread().getName()
+ "checks balance: " + balance);

try {
Thread.sleep(500);
} catch (InterruptedException ex) {
ex.printStackTrace();
}

withDrawAmmount();

}
}

}

public void withDrawAmmount() {

if (balance <= 0) {
try {
Thread.sleep(500);
} catch (InterruptedException ex) {
ex.printStackTrace();
}

System.out.println("Balance is " + balance + " not enough");
}

else {
balance = balance - 5;
System.out.println(Thread.currentThread().getName()
+ "Whitdraws, balance left: " + balance);
}
}

public static void main(String[] args) {

Runnable myJob = new synconizedThread();

Thread alpha = new Thread(myJob);
alpha.setName("alpha");
Thread beta = new Thread(myJob);
beta.setName("beta");
alpha.start();
beta.start();

}
}

最佳答案

您正在同步整个循环,因此第一个线程进入循环,然后在循环完成之前不会放弃 CPU。

相反,您可能希望同步循环的每次迭代,这样线程就有机会交替。

您还同步了对 sleep() 的调用,这可能不是您想要做的。您可能希望将其移到同步之外。

public void checkAmmount() {


for (int i = 0; i < 10; i++) {

synchronized (this) {

System.out.println(Thread.currentThread().getName()
+ "checks balance: " + balance);

withDrawAmmount();

}

try {
Thread.sleep(500);
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}

}

关于java - 第二个线程在 for 循环中不运行(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29830439/

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