介绍场景
这篇文章主要介绍java怎么实现多线程的顺序执行,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
场景
编写一个程序,启动三个线程,三个线程的名字分别是A, B, C,每个线程将自己的ID值在屏幕上打印5遍,打印顺序是ABCABC……
使用同步实现
public class MyService { ,,,private int flag =, 1; ,,,, ,,,public synchronized void 不要把(){ ,,,,,,, ,,,,,,,while (flag !=, 1) ,,,,,,,{ ,,,,,,,,,,,试一试 ,,,,,,,,,,,{ ,,,,,,,,,,,,,,,this.wait (); ,,,,,,,,,,,} ,,,,,,,,,,,catch (InterruptedException e) ,,,,,,,,,,,{ ,,,,,,,,,,,,,,,e.printStackTrace (); ,,,,,,,,,,,} ,,,,,,,} ,,,,,,,System.out.print (Thread.currentThread () . getname ()); ,,,,,,,flag =, 2; ,,,,,,,this.notifyAll (); ,,,} ,,,public synchronized void printB () { ,,,,,,,while (flag !=, 2) ,,,,,,,{ ,,,,,,,,,,,试一试 ,,,,,,,,,,,{ ,,,,,,,,,,,,,,,this.wait (); ,,,,,,,,,,,} ,,,,,,,,,,,catch (InterruptedException e) ,,,,,,,,,,,{ ,,,,,,,,,,,,,,,e.printStackTrace (); ,,,,,,,,,,,} ,,,,,,,} ,,,,,,,System.out.print (Thread.currentThread () . getname ()); ,,,,,,,flag =, 3; ,,,,,,,this.notifyAll (); ,,,} ,,,public synchronized void printC () { ,,,,,,,while (flag !=, 3) ,,,,,,,{ ,,,,,,,,,,,试一试 ,,,,,,,,,,,{ ,,,,,,,,,,,,,,,this.wait (); ,,,,,,,,,,,} ,,,,,,,,,,,catch (InterruptedException e) ,,,,,,,,,,,{ ,,,,,,,,,,,,,,,e.printStackTrace (); ,,,,,,,,,,,} ,,,,,,,} ,,,,,,,System.out.print (Thread.currentThread () . getname ()); ,,,,,,,flag =, 1; ,,,,,,,this.notifyAll (); ,,,} }
这里的判断条件中用的是,而不是,如果这两者之间有什么区别呢?线程从等待状态被唤醒,并且获得锁以后会继续往下执行,比如一个调用nofityAll()唤醒B, C,这B与C时谁会先获得锁是不确定的。如果是C先获得了锁,那么C就继续往下执行打印,这与我们的期望的不符。所以这里我们使用了一个,当C获得锁以后再去判断一下国旗,如果这时还不是它执行的时候,它就再次进入等待状态。此时A与C都是等待状态,获得锁的一定是B,从而实现我们期望的顺序打印。
测试类
package testABC; public class  TestMain { ,,,public static void main (String [], args) ,,,{//编写一个程序,启动三个线程,三个线程的ID分别是A, B, C,每个线程将自己的ID值在屏幕上打印5遍,打印顺序是ABCABC……//,,,,,,,,MyService service =, new MyService (); ,,,,,,,MyService2 service =, new MyService2 (); ,,,,,,, ,,,,,,,Thread A =, new 线程(new Runnable () ,,,,,,,{ null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null nulljava怎么实现多线程的顺序执行