经典多线程面试题

题目:子线程循环10次,接着主线程循环100次,接着又回到子线程循环10次,接着再回到主线程100次,如此循环50次,请写出程序。sql

复制代码
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等多个知识点的架构资料)合理利用本身每一分每一秒的时间来学习提高本身,不要再用"没有时间“来掩饰本身思想上的懒惰!趁年轻,使劲拼,给将来的本身一个交代! 架构

相关文章
相关标签/搜索