【发布时间】:2025-11-23 15:05:01
【问题描述】:
所以我的任务是这样的:
实例化同一类的两个对象
提供一个构造函数参数,将一个线程指定为偶数,另一个指定为奇数。
一个接一个地启动两个线程
奇数线程打印从 0 到 1000 的奇数
偶数线程打印从 0 到 1000 的偶数
但是它们应该是同步的,打印应该是 1 , 2 , 3 , 4 .....
每行一个数字
但是我似乎无法正确释放锁。我试过在这里阅读一些类似的问题,但它们都使用多个类。我做错了什么?
编辑:我的主要班级正在这样做 -
NumberPrinter oddPrinter = new NumberPrinter("odd");
NumberPrinter evenPrinter = new NumberPrinter("even");
oddPrinter.start();
evenPrinter.start();
我的输出是 - 奇数:1 偶数:2 ...
public class NumberPrinter extends Thread {
private String name;
private int starterInt;
private boolean toggle;
public NumberPrinter(String name) {
super.setName(name);
this.name=name;
if(name.equals("odd")) {
starterInt=1;
toggle = true;
}
else if(name.equals("even")) {
starterInt=2;
toggle = false;
}
}
@Override
public synchronized void run() {
int localInt = starterInt;
boolean localToggle = toggle;
if(name.equals("odd")) {
while(localInt<1000) {
while(localToggle == false)
try {
wait();
}catch(InterruptedException e) {
System.out.println("Main thread Interrupted");
}
System.out.println(name+": "+localInt);
localInt +=2;
localToggle = false;
notify();
}
}
else {
while(localInt<1000) {
while(localToggle == true)
try {
wait();
}catch(InterruptedException e) {
System.out.println("Main thread Interrupted");
}
System.out.println(name+": "+localInt);
localInt +=2;
localToggle = true;
notify();
}
}
}
}
【问题讨论】:
-
使
boolean localToggle成为static AtomicBoolean类型的字段目前它们是方法变量并且只对当前线程可见。 -
看到这个答案*.com/a/12045001/2310289
-
你使用了错误的
synchronized,它只保证你对同一个对象的方法有多个调用时会并发,看看这个documentation -
@Bohemian 由于 OP 正在实例化两个对象,那么
volatile boolean localToggle是否不需要成为静态字段才能在不同线程之间共享其状态? -
如果您想遵守上述遇到的顺序 1 、 2 、 3 、 4 .....,那么这不是并行化的好选择。请改用顺序方法。
标签: java multithreading wait synchronized