多个线程按顺序循环打印线程独有的字符串
2017-08-08 18:01
666 查看
package multithreading.analysis; import java.util.LinkedList; import java.util.Queue; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.ReentrantLock; import org.junit.Test; /** * n个线程,每个线程打印的数字不一样,必须按顺序打印 * @author mxipjs * */ public class AQSTest { private static ReentrantLock rtl = new ReentrantLock(); private static Queue<Condition> queue = new LinkedList<Condition>(); @Test public void test() throws InterruptedException{ ExecutorService exec = Executors.newCachedThreadPool(); for(int i=0;i<20;i++){ Condition con = rtl.newCondition(); queue.offer(con); exec.execute(new PrintC(con,i+"")); } TimeUnit.SECONDS.sleep(1); rtl.lock(); try { PrintC.signal(queue); //开始通知第一个打印线程 }finally { rtl.unlock(); } exec.shutdown(); while(Thread.activeCount()>2){ Thread.yield(); } System.out.println("over"); } static class PrintC implements Runnable { private String printStr; private static ThreadLocal<Integer> count = new ThreadLocal<Integer>(){ protected Integer initialValue() { return new Integer(3); }; }; private Condition con; public PrintC(Condition con,String str) { this.con = con; this.printStr = str; } @Override public void run() { while(count.get()>0){ rtl.lock(); try { con.await(); System.out.println(printStr); signal(queue); count.set(count.get()-1); } catch (InterruptedException e) { e.printStackTrace(); } finally{ rtl.unlock(); } } } public static void signal(Queue<Condition> queue){ Condition tempCondition = queue.poll(); tempCondition.signal(); queue.offer(tempCondition); } } }
相关文章推荐
- 编写程序,循环接收用户从键盘输入多个字符串,直到输入“end”时循环结束,并将所有已输入的字符串按字典顺序倒序打印。
- 编写程序,循环接收用户从键盘输入多个字符串,直到输入“end”时循环结束,并将所有已输入的字符串按字典顺序倒序打印。
- 多线程(至少三个线程)分别打印A、B、C,要求按ABC的顺序循环打印10次。
- 三个线程循环的按顺序打印
- 编写程序,循环接收用户从键盘输入多个字符串,直到输入“ end”时循环结束,并将所有 已输入的字符串按字典顺序倒序打印。
- java 线程上机题 循环唤醒 三个线程轮流打印 顺序 A线程->B线程->C线程
- 多线程编程(二)——面试题,每个线程只打印一种字符,多个线程协同顺序打印n次字符串(求大神的其他实现方案)
- 金山面试题--四个线程a,b,c,d. 线程a,b对变量i加一. 线程c,d对变量i减去一.四个线程顺序执行, 每个线程每次只执行一次.i的初始值为0, 打印结果0 1 2 1 0 1 2 1 0 1
- C语言信号量实现两线程循环打印
- 两个线程交替执行,一个打印1-52;一个打印A-Z;打印顺序为12A34B56C.....5152Z
- Java多线程--三个线程分别打印a,b,c.请用多线程实现循环打印15次abc
- 三个Java多线程循环顺序周期打印1-75个数
- 笔试题:编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推。
- 启动三个线程A,B,C,打印10次 按照ABC的顺序输出
- 已知字母序列【d, g, e, c, f, b, o, a】,请实现一个函数针对输入的一组字符串 input[] = {"bed", "dog", "dear", "eye"},按照字母顺序排序并打印
- 三个线程分别打印ABC,按顺序输出ABCABC...
- 面试题--三个线程循环打印ABC10次的几种解决方法
- 创建线程打印字符串_2个线程打印
- 写2个线程,一个打印1-52,一个打印A-Z,打印顺序是12A34B。。。(采用同步代码块和同步方法两种同步方法)
- 编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推。