面试题--多线程

来源:互联网 发布: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();
}

}
}

1 0
原创粉丝点击