zoukankan      html  css  js  c++  java
  • 各个线程顺序循环执行

    问题描述: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个任务在执行....

  • 相关阅读:
    使用puppeteer爬取网页数据实践小结
    React服务器端渲染框架next.js项目实战及部署上下文context问题解决办法
    在 React 组件中监听 android 手机物理返回/回退/back键事件
    vue页面切换效果(slide效果切换)
    记录HttpWebRequest辅助类
    C#异常Retry通用类
    Quartz.net2.2初体验
    【jQuery源码】整体架构
    CSRF攻击原理及防御
    SpringBoot----跨域配置
  • 原文地址:https://www.cnblogs.com/YDDMAX/p/5283732.html
Copyright © 2011-2022 走看看