java多线程面试题:子线程循环10次,接着主线程循环100次,接着又回到子线程循环10次,接着再回到主线程又循环100次,如此循环50次,请写出程序。
public class TestMain {
public static void main(String[] args) {
new TestMain().init();
}
private void init(){
final ThreadTask threadTask=new ThreadTask();
/**
* 子线程循环10次,接着主线程循环100次,接着又回到子线程循环10次,接着再回到主线程又循环100次,如此循环50次,请写出程序
* 分析:有两个互斥线程,需要用到同步锁
*/
new Thread(new Runnable() {
@Override
public void run() {
//子线程需要执行的任务
for(int i=1;i<=50;i++) {
threadTask.subTask(i);
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
//主线程需要执行的任务
for(int i=1;i<=50;i++) {
threadTask.mainTask(i);
}
}
}).start();
}
class ThreadTask{
private boolean isSubTask=true;
public synchronized void subTask(int i) {
while(!isSubTask) {
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//子线程执行任务
for(int j=1;j<=10;j++) {
System.out.println("subTask: 第"+i+"次循环的第"+j);
}
isSubTask=false;
this.notify();
}
public synchronized void mainTask(int i) {
while(isSubTask) {
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//主线程执行任务
for(int j=1;j<=100;j++) {
System.out.println("mainTask: 第"+i+"次循环的第"+j);
}
isSubTask=true;
this.notify();
}
}
}