經典多線程面試題

題目:子線程循環10次,接着主線程循環100次,接着又回到子線程循環10次,接着再回到主線程100次,如此循環50次,請寫出程序。

複製代碼
1 public class TraditionalThreadSynchronized2 {
2 public static void main(String[] args) throws Exception {
3 Demo1 d1 = new Demo1();
4 // 子線程
5 new Thread(new Runnable() {
6      
7 @Override
8 public void run() {
9 for (int i = 1; i <= 50; i++) {
10 try {
11 d1.sub(i);
12 } catch (InterruptedException e) {
13 // TODO Auto-generated catch block
14 e.printStackTrace();
15 }
16 }
17 }
18 }).start();
19
20 // 主線程
21 for (int i = 1; i <= 50; i++) {
22 d1.main(i);
23 }
24
25 }
26 }
27
28 class Demo1 {
29 public Boolean mainDoIt = false;標誌主線程方法是否被調用
30 // 子線程循環10次
31 public synchronized void sub(int i) throws InterruptedException {
32 while(mainDoIt) {
33 this.wait();
34 }
35 for (int j = 1; j <= 10; j++) {
36 System.out.println("sub" + j + "---SUB" + i);
37 }
38 mainDoIt=true; //子線程調用完畢
39 this.notify();// 喚醒主線程
40 }
41
42 // 主線程循環100次
43 public synchronized void main(int i) throws InterruptedException {
44 while(!mainDoIt) {
45 this.wait();
46 }
47 for (int j = 1; j <= 100; j++) {
48 System.out.println("main" + j + "---MAIN" + i);
49 }
50 mainDoIt = false;//主線程調用完畢
51 this.notify();// 喚醒子線程
52
53 }
54 }
複製代碼
解題思路:子線程語主線程爲互斥,可用SYNCHRONIZED。爲了體現Java 的高類聚性,最好能將共同數據或共同方法歸爲同一類,即編寫一個類來存放兩個同步方法。要讓他們交替進行,可用信號量控制,並用wait ,notify 進行線程間通信。 歡迎工作一到五年的Java工程師朋友們加入Java羣: 891219277
羣內提供免費的Java架構學習資料(裏面有高可用、高併發、高性能及分佈式、Jvm性能調優、Spring源碼,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多個知識點的架構資料)合理利用自己每一分每一秒的時間來學習提升自己,不要再用"沒有時間“來掩飾自己思想上的懶惰!趁年輕,使勁拼,給未來的自己一個交代!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章