作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是我为研究线程而创建的测试代码。它由分配给同一个 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/
我是一名优秀的程序员,十分优秀!