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();
}
添加回答
舉報