Java多线程有序执行的几种方法总结

  

<强> Java多线程有序执行的几种方法总结

  

同事无意间提出了这个问题,亲自实践了两种方法。当然肯定还会有更多更好的方法。

  

<强>方法一

        进口java.util.concurrent.atomic.AtomicInteger;      公开课OrderedThread1 {      静态AtomicInteger数=new AtomicInteger (0);      公共静态void main (String [] args)抛出InterruptedException {   任务task1=新任务(计数,0);   任务task2=新任务(计数,1);   任务task3=新任务(统计,2);   线程thread1=新线程(task1);   线程thread2=新线程(task2);   线程thread3=新线程(task3);   thread1.setDaemon(真正的);   thread2.setDaemon(真正的);   thread3.setDaemon(真正的);   thread1.start ();   thread2.start ();   thread3.start ();      线程。睡眠(1 * 1000);   }      }      类任务实现Runnable {      私人AtomicInteger计数;   私人int秩序;      公共任务(AtomicInteger计数,int) {   这一点。数=计数;   这一点。订单=订单;   }      @Override   公共空间run () {   而(真){   如果(count.get() % 3==顺序){   System.out.println (Thread.currentThread () . getname() + "=====" +顺序);   count.incrementAndGet ();   }   }   }   }      之前      

,,,这种方法应该是比较常见的解决方案。利用原子递增控制线程准入顺序。

  

<强>方法二

        公开课OrderedThread2 {   静态持有人持有人=new持有人();   公共静态void main (String [] args)抛出InterruptedException {      Task1 Task1=new Task1(持有者,0);   Task1 task2=new Task1(持有者,1);   Task1 task3=new Task1(持有者,2);   线程thread1=新线程(task1);   线程thread2=新线程(task2);   线程thread3=新线程(task3);   thread1.setDaemon(真正的);   thread2.setDaemon(真正的);   thread3.setDaemon(真正的);   thread1.start ();   thread2.start ();   thread3.start ();      线程。睡眠(1 * 1000);         }      }      类Task1实现Runnable {      持有人持有人;   int秩序;      公共Task1(持有人持有人,int) {   这一点。持有人=持有人;   这一点。订单=订单;   }      @Override   公共空间run () {   而(真){   如果持有人。数% 3==顺序){   System.out.println (Thread.currentThread () . getname() + "=====" +顺序);   持有人。数+ +;   }   }//int i=0;//当(我+ + & lt;10000){//持有人。数+ +;//}   }   }   类持有人{   不稳定的int数=0;   }      之前      

,,,方法二使用了不稳定的关键字。让每个线程都能拿到最新的计数的值,当其中一个线程执行+ +操作后,其他两个线程就会拿到最新的值,并检查是否符合准入条件。

  

ps:挥发性不是线程安全的。而且两者没有任何关系.volatile变量不在用户线程保存副本,因此对所有线程都能提供最新的值。但试想,如果多个线程同时并发更新这个变量,其结果也是显而易见的,最后一次的更新会覆盖前面所有更新,导致线程不安全。在方法二中,<强>一次只有一个线程满足准入条件强劲,因此不存在对变量的并发更新.volatile的值是最新的与线程安全完全是不相干的,所以不要误用挥发性实现并发控制。

  

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

Java多线程有序执行的几种方法总结