Java子线程和主线程交替输出(一个简单的实例)

来源:互联网 发布:迪奥华氏知乎 编辑:程序博客网 时间:2024/06/05 08:58

实现主线程和子线程的交替输出打印,首先创建一个实现线程方法的Service


public class Service {private volatile boolean flag = false; //这是一个控制sub和mian的开关,加关键字volatile保证不同的线程看到的flag值是最新的public synchronized void sub(){while(flag) {  //因为flag初始值是false,所以当子线程获取锁进入时不会等待,会直接输出打印try {this.wait();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}for(int i=0;i<5;i++) {System.out.println("子线程运行  "  +i);}flag = true;  //打印完成后,应当切换到main,同时应当唤醒正在等待的主线程this.notifyAll(); //子线程再次试图进入sub时,flag为true,就会进入等待,切换到了main中}public synchronized void main() {while(!flag) {  //flag初始值是false,因此,即使主线程先获取锁也会进入等待状态,并释放锁,一直到sub执行完后,flag变为true,同时,主线程被唤醒try {this.wait();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}//主线程被唤醒后,开始打印输出for(int i=0;i<5;i++) {System.out.println("main线程运行  "  +i);}flag = false;  //然后又切换到sub,并唤醒等待的子线程this.notifyAll();}}



sub方法是子线程调用的,main方法是主线程调用


public static void main(String[] args) throws InterruptedException {final Service service = new Service();Runnable r = new Runnable() {@Overridepublic void run() {for(int i=0;i<5;i++) {service.sub();         //多次试图运行子线程}}};Thread thread = new Thread(r);thread.start();for(int i=0;i<5;i++) {service.main();   //和子线程竞争锁}}

这样,子线程启动后,会和主线程同时竞争service的锁,因为flag初始值是false,则即使主线程先获取的锁,也会进入等待,释放锁,所以,首先会打印子线程的输出,子线程打印完成后,flag变为true,并且唤醒的其他的线程(因为一共就两个线程,所以,另一个等待的线程就是主线程)。然后又回到了原始的状态,只是这次flag是true,因此,主线程会获取到锁,并打印输出,这样依次会交替5次。