java怎么实现多线程的顺序执行

  介绍

这篇文章主要介绍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   null

java怎么实现多线程的顺序执行