三个Java线程(使用线程池)交替打印1到75个数的两种解法
2013-07-05 09:17
711 查看
解法一:
[java] view
plaincopy
还有另外一个解法:
package net.liuyx.test;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class Test {
private static final int TASK_NUM = 3;
private static int num = 0;
private static int flag = 0;
private static Lock lock = new ReentrantLock();
private static List<Condition> list = new ArrayList<Condition>();
private static ExecutorService exec = Executors.newCachedThreadPool();
static {
for(int i = 0; i < TASK_NUM; i++){
list.add(lock.newCondition());
}
}
private static void crit() {
if (num >= 75) {
System.exit(1);
}
}
private static void print() {
crit();
System.out.print(Thread.currentThread());
for (int i = 0; i < 5; i++) {
System.out.format("%-2d ", ++num);
}
System.out.println();
}
private static void work(int i) {
while (!Thread.interrupted()) {
try{
lock.lock();
if(flag == i){
crit();
print();
flag = (i + 1) % list.size();
list.get((i+1)%list.size()).signal();
}else{
try {
list.get(i%list.size()).await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}finally{
lock.unlock();
}
}
}
private static class Task implements Runnable {
private final int i;
public Task(int i) {
this.i = i;
}
@Override
public void run() {
work(i);
}
}
/**
* @param args
*/
public static void main(String[] args) {
for (int i = 0; i < list.size(); i++)
exec.execute(new Task(i));
}
}
解法二:
http://blog.csdn.net/lyx2007825/article/details/7767408
[java] view
plaincopy
还有另外一个解法:
package net.liuyx.test;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class Test {
private static final int TASK_NUM = 3;
private static int num = 0;
private static int flag = 0;
private static Lock lock = new ReentrantLock();
private static List<Condition> list = new ArrayList<Condition>();
private static ExecutorService exec = Executors.newCachedThreadPool();
static {
for(int i = 0; i < TASK_NUM; i++){
list.add(lock.newCondition());
}
}
private static void crit() {
if (num >= 75) {
System.exit(1);
}
}
private static void print() {
crit();
System.out.print(Thread.currentThread());
for (int i = 0; i < 5; i++) {
System.out.format("%-2d ", ++num);
}
System.out.println();
}
private static void work(int i) {
while (!Thread.interrupted()) {
try{
lock.lock();
if(flag == i){
crit();
print();
flag = (i + 1) % list.size();
list.get((i+1)%list.size()).signal();
}else{
try {
list.get(i%list.size()).await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}finally{
lock.unlock();
}
}
}
private static class Task implements Runnable {
private final int i;
public Task(int i) {
this.i = i;
}
@Override
public void run() {
work(i);
}
}
/**
* @param args
*/
public static void main(String[] args) {
for (int i = 0; i < list.size(); i++)
exec.execute(new Task(i));
}
}
解法二:
http://blog.csdn.net/lyx2007825/article/details/7767408
相关文章推荐
- 三个Java线程(使用线程池)交替打印1到75个数的两种解法
- java中使用ReentrantLock锁中的Condition实现三个线程之间通信,交替输出信息
- 使用Java线程并发库实现两个线程交替打印的线程题
- 详解使用synchronized解决三个线程依次轮流打印出75个数
- 使用Java线程并发库实现两个线程交替打印的线程题
- 使用Lock,Condition解决三个线程依次轮流打印出75个数
- 三个线程交替打印ABC
- java 三个线程交替执行
- 三个线程轮流执行顺序打印ABC(三):使用Lock实现
- 迅雷笔试题 (JAVA多线程)启动三个线程,分别打印A B C,现在写一个程序 循环打印ABCABCABC
- java 三个线程分别打印A B C 50次
- Java实现多线程经典问题:使用三个线程实现输出ABCABC循环
- 控制三个线程交替打印ABC
- 建立三个线程,A线程打印10次A,B线程打印10次B,C线程打印10次C,要求线程同时运行,交替打印10次ABC。
- JAVA程序设计(18.1)----- 1多线程轮流打印 线程调度 线程池 synchronized wait notify 内部类
- Java并发编程--三个线程顺序打印ABC
- 有三个线程名字分别是A、B、C,每个线程只能打印自己的名字,在屏幕上顺序打印 ABC,打印10次。不准使用线程的sleep()
- java多线程面试题:三个线程顺序打印ABC,重复10次
- 转:java实现三个线程A B C,A线程打印A之后才能B线程打印B,然后接着C线程执行打印C,继而循环下去
- java使用三个线程,按顺序线程1输出1、线程2输出2、线程3输出3