2 回答
TA贡献1801条经验 获得超8个赞
不,亲爱的,你的实施不正确。哪个线程有机会运行是由操作系统决定的。无法保证线程 1 和 2 会相继执行。
您可以通过检查变量 curr 的先前值来修复代码,如果该值不是该线程期望的值,则不要增加并打印。
为我:
if(curr.threadName.equals("Thread 2") && (curr%2 !=0))
{
// Increment
}
TA贡献1784条经验 获得超9个赞
您不能使用单锁来实现此目的。即使ReentrantLock提供公平性,但它无法控制线程调度。
我们可以实现像抛出一样的线程间通信Semaphore。信号量控制线程的执行。
我们创建两个线程,一个奇数线程和一个偶数线程。奇数线程将打印从 1 开始的奇数,偶数线程将打印从 2 开始的偶数。
创建两个信号量 semOdd 和 semEven,它们一开始有 1 和 0 许可。这将确保首先打印奇数。
class SharedPrinter {
private Semaphore semEven = new Semaphore(0);
private Semaphore semOdd = new Semaphore(1);
void printEvenNum(int num) {
try {
semEven.acquire();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
System.out.println(Thread.currentThread().getName() + num);
semOdd.release();
}
void printOddNum(int num) {
try {
semOdd.acquire();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
System.out.println(Thread.currentThread().getName() + num);
semEven.release();
}
}
class Even implements Runnable {
private SharedPrinter sp;
private int max;
// standard constructor
@Override
public void run() {
for (int i = 2; i <= max; i = i + 2) {
sp.printEvenNum(i);
}
}
}
class Odd implements Runnable {
private SharedPrinter sp;
private int max;
// standard constructors
@Override
public void run() {
for (int i = 1; i <= max; i = i + 2) {
sp.printOddNum(i);
}
}
}
public static void main(String[] args) {
SharedPrinter sp = new SharedPrinter();
Thread odd = new Thread(new Odd(sp, 10),"Odd");
Thread even = new Thread(new Even(sp, 10),"Even");
odd.start();
even.start();
}
添加回答
举报