<强> 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多线程有序执行的几种方法总结