多线程相关的编程题
题目:子线程循环10次,接着主线程循环100次,接着又回到子线程循环10次,
接着又回到主线程循环100次,如此反复50次,请写出程序。
//经验:要用到共同数据(包括同步锁)的若干方法应该归在同一个类身上,
// 这种设计设计正好体现了高聚合和程序程序的健壮性。
//子线程和主线程切换需要引入flag变量,如果cpu执行权先交给了主线程,则需要让
// 主线程进行等待,这时候就可以让子线程执行,执行后唤醒主线程。
//在判断标记的时候,用while更好,因为线程有时候会在没有被通知的情况下唤醒,称为伪唤醒
// 这时候,用while进行重复检测是最好的。
public class Test1 {
public static void main(String[] args){
final Business business=new Business();
new Thread(
new Runnable() {
@Override
public void run() {
for (int i=1;i<=50;i++){
business.sub(i);
}
}
}
).start();
for (int i=1;i<=50;i++){
business.main(i);
}
}
}
class Business{
private boolean flag=true;
public synchronized void sub(int i){
while (!flag) {
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
for (int j = 1; j <= 10; j++) {
System.out.println("sub thread sequece of " + j + " loop of " + i);
}
}
flag=false;
this.notify();
}
public synchronized void main(int i){
while(flag) {
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
for (int j = 1; j <= 100; j++) {
System.out.println("main thread sequece of " + j + " loop of " + i);
}
}
flag=true;
this.notify();
}
}