三个Java多线程循环顺序周期打印1-75个数(用CyclicBarrier实现代码)

三个Java多线程循环顺序周期打印1-75个数(用CyclicBarrier实现代码)

标签: 多线程javaclassstring
  3139人阅读  评论(0)  收藏  举报
  分类:
[java]  view plain  copy
  1. package net.liuyx.java;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5. import java.util.concurrent.BrokenBarrierException;  
  6. import java.util.concurrent.CyclicBarrier;  
  7. import java.util.concurrent.ExecutorService;  
  8. import java.util.concurrent.Executors;  
  9. import java.util.concurrent.TimeUnit;  
  10.   
  11.   
  12. public class PrintNum {  
  13.     static final int FINAL_NUM = 75;  
  14.     private List<PrintTasks> tasks = new ArrayList<PrintTasks>();  
  15.     private ExecutorService exec = Executors.newCachedThreadPool();  
  16.     private CyclicBarrier barrier;  
  17.     public PrintNum(int nTasks, final int pause) {  
  18.         barrier = new CyclicBarrier(nTasks,new Runnable() {  
  19.   
  20.             @Override  
  21.             public void run() {  
  22.                 for(PrintTasks task : tasks)  
  23.                     if(task.getNum() >= FINAL_NUM) {  
  24.                         exec.shutdownNow();  
  25.                         return;  
  26.                     }else {  
  27.                         task.printNum();  
  28.                     }  
  29.             }  
  30.         });  
  31.         try {  
  32.             TimeUnit.MILLISECONDS.sleep(pause);  
  33.         } catch (InterruptedException e) {  
  34.             e.printStackTrace();  
  35.         }  
  36.         for(int i = 0; i < nTasks; i++) {  
  37.             PrintTasks task = new PrintTasks(barrier);  
  38.             tasks.add(task);  
  39.             exec.execute(task);  
  40.         }  
  41.     }  
  42.     public static void main(String[] args) {  
  43.         new PrintNum(3,100);  
  44.     }  
  45. }  
  46.   
  47. class PrintTasks implements Runnable{  
  48.     private static int counter = 0;  
  49.     private final int id = counter++;  
  50.     private static volatile int num = 0;  
  51.       
  52.     private CyclicBarrier barrier;  
  53.     public PrintTasks(CyclicBarrier b) {  
  54.         barrier = b;  
  55.     }  
  56.       
  57.     public synchronized int getNum() {  
  58.         return num;  
  59.     }  
  60.   
  61.     @Override  
  62.     public void run() {  
  63.         try {  
  64.             while(!Thread.interrupted()) {  
  65.                 barrier.await();  
  66.             }  
  67.         } catch (InterruptedException e) {  
  68.         } catch (BrokenBarrierException e) {  
  69.             throw new RuntimeException(e);  
  70.         }  
  71.     }  
  72.       
  73.     public void printNum() {  
  74.         System.out.print("线程 " + id + ": ");  
  75.         for(int i = 0; i < 5; i++) {  
  76.             System.out.format("%3d", ++num);  
  77.         }  
  78.         System.out.println();  
  79.     }  
  80. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值