面试题--多线程
来源:互联网 发布:java个人简历自我评价 编辑:程序博客网 时间:2024/04/29 22:36
一道IBM多线程的面试题
问题描述:子线程循环10次,接着主线程循环100,接着又回到子线程循环10次,接着再回到主线程又循环100,如此循环50次,请写出程序。
问题分析:子线程、主线程各自有自己的循环,但是两个循环都要进行50次,而且是交替运行50次。
1、子线程循环10次、主线程循环100次可以通过线程互斥实现:子线程运行时,主线程不能够运行;主线程运行时子线程不能够运行,利用synchronized关键字实现。
2、为了实现交替运行,需要用到线程同步,子线程和主线程操作一个公共变量,通过公共变量的释放和获取,实现交替运行。这时,为了方便交替实现,把变化的部分抽象为一个类的不同方法,通过调用该类的不同方法实现不同的线程运行状况。这种设计方案实现了“高内聚、低耦合”的设计方法。
全部代码(该代码可以直接运行):
package ThreadTest;
public class TraditionalThreadCommunication {
public static void main(String[] args) {
// TODO Auto-generated method stub
final Bussness business = new Bussness();
//thread1
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
for(int i=1; i<=10; i++){
//子线程调用业务类的方法
business.sub(i);
}
}
}).start();
for(int m=1; m<=10; m++){
//主线程调用业务类的方法,即类中main()方法调用主线程方法
business.main(m);
}
}
}
/*************************************************
* 互斥上锁的代码应该放在资源类的内部方法中,而不是线程代码中。
* 因为包括循环10次的sub方法和循环100次的main方法。
* 这是一个类中两个变化的不同的方法,需要抽象为资源类。
* 高内聚、低耦合!!!!!
* ***********************************************/
class Bussness{
private boolean bShouldSub = true;
public synchronized void sub(int i){
//此处用while(!bShouldSub)更加好,因为这样可以防止为唤醒
if(!bShouldSub){
try {
this.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
else{
for(int j=1; j<=10; j++){
System.out.println("Sub thread sequence of " + j + " loop of " + i );
}
//change the share value--bShouldSub
bShouldSub = false;
this.notify();
}
}
public synchronized void main(int i){
//此处用while(!bShouldSub)更加好,因为这样可以防止为唤醒
if(bShouldSub){
try {
this.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
else{
for(int j=1; j<=100; j++){
System.out.println("Main thread sequence of " + j + " loop of " + i );
}
//change the share value--bShouldSub
bShouldSub = true;
this.notify();
}
}
}
- java多线程面试题
- 多线程面试题
- 多线程面试题
- 多线程面试题
- linux-多线程--面试题
- linux--多线程--面试题
- java多线程面试题
- 多线程面试题
- 多线程面试题
- java多线程面试题
- 多线程经典面试题
- java多线程面试题
- 多线程面试题
- linux-多线程--面试题
- java多线程面试题
- java多线程面试题
- Java多线程面试题
- linux-多线程--面试题
- android轻松管理安卓应用中的log日志 发布应用时log日志全部去掉的方法
- Android学习之路
- MySql为何默认不用hash索引而用BTree索引的几点原因
- centos6.7 修改最大打开进程数和文件数
- H5知识点大总结勾起你的欲望
- 面试题--多线程
- 状态机
- 37. Sudoku Solver
- Qt中如何获取当前控件类型
- 经典Sql语句
- 忽略编译警告
- 利用正则表达式排除特定字符串
- colors
- oracle 删除步骤