经典多线程面试题
题目:子线程循环10次,接着主线程循环100次,接着又回到子线程循环10次,接着再回到主线程100次,如此循环50次,请写出程序。
1publicclass TraditionalThreadSynchronized2 { 2publicstaticvoidmain(String[] args)throws Exception { 3Demo1 d1 =new Demo1(); 4// 子线程 5newThread(new Runnable() { 6 7 @Override 8publicvoid run() { 9for(inti = 1; i <= 50; i++) {10try {11 d1.sub(i);12}catch (InterruptedException e) {13// TODO Auto-generated catch block14 e.printStackTrace();15 }16 }17 }18 }).start();1920// 主线程21for(inti = 1; i <= 50; i++) {22 d1.main(i);23 }2425 }26}2728class Demo1 {29publicBoolean mainDoIt =false;标志主线程方法是否被调用30// 子线程循环10次31publicsynchronizedvoidsub(inti)throws InterruptedException {32while(mainDoIt) {33this.wait();34 }35for(intj = 1; j <= 10; j++) {36System.out.println("sub" + j + "---SUB" + i);37 }38mainDoIt=true; //子线程调用完毕39this.notify();// 唤醒主线程40 }4142// 主线程循环100次43publicsynchronizedvoidmain(inti)throws InterruptedException {44while(!mainDoIt) {45this.wait();46 }47for(intj = 1; j <= 100; j++) {48System.out.println("main" + j + "---MAIN" + i);49 }50mainDoIt =false;//主线程调用完毕51this.notify();// 唤醒子线程5253 }54}
解题思路:子线程语主线程为互斥,可用SYNCHRONIZED。为了体现Java 的高类聚性,最好能将共同数据或共同方法归为同一类,即编写一个类来存放两个同步方法。要让他们交替进行,可用信号量控制,并用wait ,notify 进行线程间通信。 欢迎工作一到五年的Java工程师朋友们加入Java群: 891219277
群内提供免费的Java架构学习资料(里面有高可用、高并发、高性能及分布式、Jvm性能调优、Spring源码,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多个知识点的架构资料)合理利用自己每一分每一秒的时间来学习提升自己,不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代!