Java实现指定线程执行顺序的三种方式示例

  

本文实例讲述了Java实现指定线程执行顺序的三种方式。分享给大家供大家参考,具体如下:

  

<强>方法一:通过共享对象锁加上可见变量来实现。

        公开课MyService {   私人波动int orderNum=1;   公共同步空白methodA () {   尝试{   而(orderNum !=1) {   wait ();   }   for (int i=0;我& lt;2;我+ +){   System.out.println(“五星级”);   }   orderNum=2;   notifyAll ();   }捕捉(InterruptedException e) {   e.printStackTrace ();   }   }   公共同步空白methodB () {   尝试{   而(orderNum !=2) {   wait ();   }   for (int i=0;我& lt;2;我+ +){   System.out.println (“BBBBB”);   }   orderNum=3;   notifyAll ();   }捕捉(InterruptedException e) {   e.printStackTrace ();   }   }   公共同步空白methodC () {   尝试{   而(orderNum !=3) {   wait ();   }   for (int i=0;我& lt;2;我+ +){   System.out.println (“CCCCC”);   }   orderNum=1;   notifyAll ();   }捕捉(InterruptedException e) {   e.printStackTrace ();   }   }   }      之前            进口service.MyService;   公共类ThreadAA扩展线程{   私人MyService dbtools;   公共ThreadAA (MyService dbtools) {   超级();   这一点。dbtools=dbtools;   }   @Override   公共空间run () {   dbtools.methodA ();   }   }      之前            进口service.MyService;   公共类ThreadBB扩展线程{   私人MyService dbtools;   公共ThreadBB (MyService dbtools) {   超级();   这一点。dbtools=dbtools;   }   @Override   公共空间run () {   dbtools.methodB ();   }   }      之前            进口service.MyService;   公共类ThreadCC扩展线程{   私人MyService dbtools;   公共ThreadCC (MyService dbtools) {   这一点。dbtools=dbtools;   }   @Override   公共空间run () {   dbtools.methodC ();   }   }      之前            进口extthread.ThreadCC;   进口service.MyService;   进口extthread.ThreadAA;   进口extthread.ThreadBB;   公共类运行{   公共静态void main (String [] args) {   MyService MyService=new MyService ();   for (int i=0;我& lt;2;我+ +){   ThreadBB输出=new ThreadBB (myService);   output.start ();   ThreadAA输入=new ThreadAA (myService);   input.start ();   ThreadCC ThreadCC=new ThreadCC (myService);   threadCC.start ();   }   }   }      之前      

执行结果:

  

癑ava实现指定线程执行顺序的三种方式示例"

  

可以看到线程的启动按顺序执行了。共享对象锁,可以保证每个方法只能同时有一个线程进入,配合等和notifyall方法,可以启动或者唤醒线程。

  

<强>方法二:通过主线程加入()

        类T11扩展线程{   公共空间run () {   系统。println(“在T1);   }   }   类T22延伸线程{   公共空间run () {   系统。println(“在T2);   }   }   类T33扩展线程{   公共空间run () {   系统。println(“在T3);   }   }   公开课Test2 {   公共静态void main (String [] args)抛出InterruptedException {   T11 t1=new T11 ();   T22 t2=new T22 ();   T33 t3=new T33 ();   t1.start ();   t1.join ();   t2.start ();   t2.join ();   t3.start ();   }   }      之前      

<强>方法三:通过线程执行时加入()

        类T1延伸线程{   公共空间run () {   随机随机=new随机();   尝试{   thread . sleep (random.nextInt (1000));   }捕捉(InterruptedException e) {   e.printStackTrace ();   }   系统。println(“在T1);   }   }   类T2延伸线程{   私人线程的线程;   公共T2(线程的线程){   这一点。线程=线程;   }   公共空间run () {   尝试{   thread.join ();   }捕捉(InterruptedException e) {   e.printStackTrace ();   }   系统。println(“在T2);   }   }   类T3延伸线程{   私人线程的线程;   公共T3(线程的线程){   这一点。线程=线程;   }   公共空间run () {   尝试{   thread.join ();   }捕捉(InterruptedException e) {   e.printStackTrace ();   }   系统。println(“在T3);   }   }   公共类测试{   公共静态void main (String [] args)抛出InterruptedException {   T1 T1=new T1 ();   T2 T2=new T2 (t1);   T3 T3=new T3 (t2);   t2.start ();   t1.start ();   t3.start ();   }   }      

Java实现指定线程执行顺序的三种方式示例