本程序为实现两个线程来回调用,要求main线程调用100次,sub线程调用10次,以上步骤反复50次。
主要思想是将控制线程同步的代码写在资源类内,而不是run方法内
具体代码
Business.java
/**
* Created by lance on 2017/12/18.
*/
public class Business {
public static boolean isSub=false;//判断是否轮到sub线程执行
public synchronized void sub(int i){
if(!isSub){
try {
this.wait();//等待main执行完唤醒自己
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for(int j=0;j<10;j++){
System.out.println("sub"+j+", loop "+i);
}
isSub=false;
this.notify();//唤醒main
}
public synchronized void main(int i){
if(isSub){
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for(int j=0;j<100;j++){
System.out.println(" Main"+j+", loop "+i);
}
isSub=true;
this.notify();
}
}
ThreadMain.java
public class ThreadMain extends Thread {
Business business;
public ThreadMain(Business business){
this.business=business;
}
@Override
public void run(){
for(int i=0;i<50;i++){
business.main(i);
}
}
}
ThreadSub.java
public class ThreadSub extends Thread{
Business business;
public ThreadSub(Business business){
this.business=business;
}
@Override
public void run(){
for(int i=0;i<50;i++){
business.sub(i);
}
}
}
Client.java
public class Client {
public static void main(String args[]){
Business business=new Business();
ThreadMain threadMain=new ThreadMain(business);
ThreadSub threadSub=new ThreadSub(business);
threadMain.start();
threadSub.start();
}
}