各个线程顺序循环执行

Posted YDDMAX

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了各个线程顺序循环执行相关的知识,希望对你有一定的参考价值。

问题描述:A任务执行完之后执行B任务,B任务执行之后再执行C任务,C任务执行完之后A再执行任务,以此循环下去

Task

 1 package com.ydd.work.concurrent;
 2 
 3 import java.util.concurrent.atomic.AtomicInteger;
 4 /**
 5  * 
 6  * @author yunzhu.ydd
 7  *
 8  */
 9 public  class Task extends  Thread {
10 
11     protected AtomicInteger flag;
12     private int number;
13     private int id;
14     public Task( AtomicInteger flag,int number,int id)
15     {
16         this.flag=flag;
17         this.number=number;
18         this.id=id;
19     }
20    @Override
21     public void run() {
22      while(!Thread.interrupted())
23      {
24          synchronized(flag)
25          {
26              while(flag.get()!=id)
27              {
28                  try {
29                     flag.wait();
30                 } catch (InterruptedException e) {
31                     // TODO Auto-generated catch block
32                     e.printStackTrace();
33                 }
34              }
35           }
36          System.out.println("第"+id+"个任务在执行....");
37          //其他的任务
38          synchronized(flag)
39          {
40           flag.set((flag.get()+1)%number);
41            flag.notifyAll();
42          }
43      }
44 
45     }
46 
47 }

Main

package com.ydd.work.concurrent;

import java.util.concurrent.atomic.AtomicInteger;
/**
 * 
 * @author yunzhu.ydd
 *
 */
public  class Task extends  Thread {

	protected AtomicInteger flag;
	private int number;
	private int id;
	public Task( AtomicInteger flag,int number,int id)
	{
		this.flag=flag;
		this.number=number;
		this.id=id;
	}
   @Override
	public void run() {
	 while(!Thread.interrupted())
	 {
		 synchronized(flag)
		 {
			 while(flag.get()!=id)
			 {
				 try {
					flag.wait();
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			 }
          }
	     System.out.println("第"+id+"个任务在执行....");
		 //其他的任务
		 synchronized(flag)
		 {
		  flag.set((flag.get()+1)%number);
		   flag.notifyAll();
		 }
	 }

	}

}

  结果:

第2个任务在执行....
第3个任务在执行....
第4个任务在执行....
第5个任务在执行....
第6个任务在执行....
第7个任务在执行....
第8个任务在执行....
第9个任务在执行....
第0个任务在执行....
第1个任务在执行....
第2个任务在执行....
第3个任务在执行....
第4个任务在执行....
第5个任务在执行....
第6个任务在执行....
第7个任务在执行....
第8个任务在执行....
第9个任务在执行....
第0个任务在执行....
第1个任务在执行....
第2个任务在执行....
第3个任务在执行....
第4个任务在执行....
第5个任务在执行....
第6个任务在执行....
第7个任务在执行....
第8个任务在执行....
第9个任务在执行....
第0个任务在执行....
第1个任务在执行....
第2个任务在执行....
第3个任务在执行....
第4个任务在执行....
第5个任务在执行....
第6个任务在执行....
第7个任务在执行....
第8个任务在执行....
第9个任务在执行....

以上是关于各个线程顺序循环执行的主要内容,如果未能解决你的问题,请参考以下文章

硬核!管理mysql数据库的工具

java开发的项目案例,大厂内部资料

事件循环(搞懂异步各任务的执行顺序)

Java进阶之光!2021必看-Java高级面试题总结

Java工程师面试题,二级java刷题软件

经验总结:Java高级工程师面试题-字节跳动,成功跳槽阿里!