Java多線程基礎(四)Java傳統線程同步通信技術
Java多線程基礎(四)Java傳統線程同步通信技術
編寫代碼實現以下功能
子線程循環10次,接著主線程循環100次,接著又回到子線程循環10次,接著再回到主線程又循環100次,如此循環50次。
分析
1)子線程循環10次與主線程循環100次必須是互斥的執行,不能出現交叉,下面代碼中通過synchronized關鍵字實現此要求;
2)子線程與主線程必須交替出現,可以通過線程同步通信技術實現,下面代碼中通過bShouldSub變量實現此要求;
其他需要注意的地方
1)其中business變量必須聲明為final類型,因為在匿名內部類和局部內部類中調用的局部變量必須是final的,這樣保證:
- 變量的一致性(編譯時final變量會被復制一份作為局部內部類的變量);
- 并避免局部變量的生命周期與局部內部類的對象的生命周期不一致。
否則,
- 若該變量被傳入局部內部類之后,局部變量在外部類中被修改,則內部類中該變量的值與外部類中不一致,可能導致不可預知的情況發生;
- 或是導致局部變量生命周期隨著方法的結束而從棧中清除,局部內部類訪問一個已不存在的變量。
若是成員變量,則不需要是final的。
詳情可參考以下文章:
http://feiyeguohai.iteye.com/blog/1500108
http://blog.csdn.net/whuslei/article/details/6251020
2)內部類分為成員內部類、靜態內部類、局部內部類、匿名內部類四種,四者的生命周期及詳細使用方法請自行問谷歌或度娘。
代碼實現
package cn.king;
public class TraditionalThreadCommunication {
public static void main(String[] args) {
// 必須聲明為final
final Business business = new Business();
new Thread(
new Runnable() {
@Override
public void run() {
for(int i=1; i<=50; i++) {
business.sub(i);
}
}
}
).start();
for(int i=1; i<=50; i++) {
business.main(i);
}
}
}
class Business {
// 該變量用于線程間通信
private boolean bShouldSub = true;
public synchronized void sub(int i) {
if(!bShouldSub) {
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for(int j=1; j<=10; j++) {
System.out.println("sub thread sequence of "
+ j + ", loop of " + i);
}
bShouldSub = false;
this.notify();
}
public synchronized void main(int i) {
if(bShouldSub) {
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for(int j=1; j<=100; j++) {
System.out.println("main thread sequence of "
+ j + ", loop of " + i);
}
bShouldSub = true;
this.notify();
}
} 來自: http://blog.csdn.net//kingzone_2008/article/details/49853341
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!