我是多線程新手。我想寫一個程序,我有兩個線程。一個線程打印奇數,然後放棄使用wait()和類似的其它線程打印偶數的監視器鎖定並打印
我有4個班Java代碼 - 線程彼此阻塞
- Odd.java號碼後放棄鎖(打印1-100之間奇數)
- Even.java(印刷甚至1-100之間數)
- SomeMaths.java(已得到邏輯用於打印奇數和偶數)
- OEApp.java(啓動線程的主類)
問題 - 我的代碼按預期工作,大部分時間,即按順序打印1到100。這兩個線程輪流。但我注意到,有一個bug.Sometimes偶數線程被安排第一,並得到如下輸出
2 **********
1 ###############################
,沒有什麼會打印後,貌似有一個死鎖情況。我無法弄清楚爲什麼。請幫我理解這個
public class SomeMaths {
public synchronized void printOdd(){
for(int i=1;i<=100;i++){
if(i%2 !=0) {
System.out.println(i + " ###############################");
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
notify();
}
}
public synchronized void printEven(){
for(int i=1;i<=100;i++){
if(i%2 ==0){
System.out.println(i +" **********");
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
notify();
}
}
}
public class Odd implements Runnable {
SomeMaths sm;
public Odd(SomeMaths sm){
this.sm = sm;
}
@Override
public void run(){
sm.printOdd();
}
}
public class Even extends Thread {
SomeMaths sm;
public Even(SomeMaths sm){
this.sm = sm;
}
@Override
public void run(){
sm.printEven();
}
}
public class OEApp {
public static void main(String[] args) {
SomeMaths sm = new SomeMaths();
Thread odd = new Thread(new Odd(sm));
Thread even = new Thread(new Even(sm));
odd.start();
even.start();
try {
odd.join();
even.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
*好奇:*如果'Even'延伸'Thread',你爲什麼用'新主題(新連(SM))'另一個線程封裝器呢? – Andreas