经典多线程面试题

题目:子线程循环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等多个知识点的架构资料)合理利用自己每一分每一秒的时间来学习提升自己,不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代!

你可能感兴趣的:(经典多线程面试题)