三个Java多线程循环顺序周期打印1-75个数(用CyclicBarrier实现代码)
2017-08-17 21:54
573 查看
三个Java多线程循环顺序周期打印1-75个数(用CyclicBarrier实现代码)
标签: 多线程javaclassstring2012-07-20 14:44 3139人阅读 评论(0) 收藏 举报
分类:
Java(9)
版权声明:本文为博主原创文章,未经博主允许不得转载。
[java] view
plain copy
package net.liuyx.java;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
public class PrintNum {
static final int FINAL_NUM = 75;
private List<PrintTasks> tasks = new ArrayList<PrintTasks>();
private ExecutorService exec = Executors.newCachedThreadPool();
private CyclicBarrier barrier;
public PrintNum(int nTasks, final int pause) {
barrier = new CyclicBarrier(nTasks,new Runnable() {
@Override
public void run() {
for(PrintTasks task : tasks)
if(task.getNum() >= FINAL_NUM) {
exec.shutdownNow();
return;
}else {
task.printNum();
}
}
});
try {
TimeUnit.MILLISECONDS.sleep(pause);
} catch (InterruptedException e) {
e.printStackTrace();
}
for(int i = 0; i < nTasks; i++) {
PrintTasks task = new PrintTasks(barrier);
tasks.add(task);
exec.execute(task);
}
}
public static void main(String[] args) {
new PrintNum(3,100);
}
}
class PrintTasks implements Runnable{
private static int counter = 0;
private final int id = counter++;
private static volatile int num = 0;
private CyclicBarrier barrier;
public PrintTasks(CyclicBarrier b) {
barrier = b;
}
public synchronized int getNum() {
return num;
}
@Override
public void run() {
try {
while(!Thread.interrupted()) {
barrier.await();
}
} catch (InterruptedException e) {
} catch (BrokenBarrierException e) {
throw new RuntimeException(e);
}
}
public void printNum() {
System.out.print("线程 " + id + ": ");
for(int i = 0; i < 5; i++) {
System.out.format("%3d", ++num);
}
System.out.println();
}
}
相关文章推荐
- 三个Java多线程循环顺序周期打印1-75个数(用CyclicBarrier实现代码)
- 三个Java多线程循环顺序周期打印1-75个数
- 三个Java多线程循环打印递增的数字,每个线程打印5个数值,打印周期1-75
- 面试题:100个小朋友围在一起,设定编号为1~100,依次按1,2,3,4,5,6,7,8,9循环报数,报到9的小朋友出圈,请写代码打印各个小朋友的出圈顺序?(Python实现)
- Java多线程--三个线程分别打印a,b,c.请用多线程实现循环打印15次abc
- java实现三个线程A B C,A线程打印A之后才能B线程打印B,然后接着C线程执行打印C,继而循环下去
- java实现【有三个线程ID分别是A、B、C,请有多线编程实现,在屏幕上循环打印10次ABC.】
- 有三个线程ID分别是A、B、C,请有多线编程 实现 在屏幕上循环打印10次ABCABC......
- 转:java实现三个线程A B C,A线程打印A之后才能B线程打印B,然后接着C线程执行打印C,继而循环下去
- 有三个线程ID分别是A、B、C,请有多线编程实现,在屏幕上循环打印10次ABCABC
- 三个线程轮流执行顺序打印ABC(二):使用Lock+Condition实现
- java多线程---顺序打印ABC的三种实现---synchronized方式
- 转:java实现三个线程A B C,A线程打印A之后才能B线程打印B,然后接着C线程执行打印C,继而循环下去
- 看数据结构写代码(16)顺序队列的实现(循环队列)
- 三个线程轮流执行顺序打印ABC(三):使用Lock实现
- 三个线程循环的按顺序打印
- java多线程实现三个字母顺序输出
- Semaphore实现的三个线程协作循环打印10次ABC的方法
- 有三个线程ID分别是A、B、C,请有多线编程实现,在屏幕上循环打印10次ABCABC
- 一个关于线程的经典面试题,要求用三个线程,按顺序打印1,2,3,4,5.... 71,72,73,74, 75. 线程1先打印1,2,3,4,5, * 然后是线程2打印6,7,8,9,10, 然后是