两道多线程打印题目
来源:互联网 发布:内涵吧源码 编辑:程序博客网 时间:2024/06/07 22:41
1.每个线程打印不同的字符
public class ThreadPrint{ public static void main(String[] args) throws InterruptedException { String str = "ABCD"; int index = 4; Character c; Map<Character, MyLock> locks = new HashMap<>(); MyLock lock = new MyLock(); for (int i = 0; i < index; i++) { for (int j = 0; j < str.length(); j++) { c = str.charAt(j); if (null == locks.get(c)) { lock = new MyLock(); lock.setCountDownLatch(new CountDownLatch(1)); new Thread(new MyRunnable(c, lock)).start(); locks.put(c, lock); lock.getCountDownLatch().await(); } else { lock = locks.get(c); lock.setCountDownLatch(new CountDownLatch(1)); synchronized (lock) { locks.get(c).notify(); } lock.getCountDownLatch().await(); } } } for (Entry<Character, MyLock> entry : locks.entrySet()) { synchronized (entry.getValue()) { entry.getValue().setEnd(true); entry.getValue().notify(); } } } static class MyLock { private boolean end = false; private CountDownLatch countDownLatch; public CountDownLatch getCountDownLatch() { return countDownLatch; } public void setCountDownLatch(CountDownLatch countDownLatch) { this.countDownLatch = countDownLatch; } public boolean isEnd() { return end; } public void setEnd(boolean end) { this.end = end; } } static class MyRunnable implements Runnable { private char c; private MyLock lock; public MyRunnable(char c, MyLock lock) { this.c = c; this.lock = lock; } @Override public void run() { synchronized (lock) { while (!lock.isEnd()) { System.out.print(c); lock.getCountDownLatch().countDown(); try { lock.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } } public char getC() { return c; } public void setC(char c) { this.c = c; } }}
2.两个线程交替打印一段字符串
public class PrintWithTwoThread{ static int i = 0; public static void main(String[] args) { String str = "I'am hahaha"; new Thread(() -> { synchronized (str) { while (i < str.length()) { System.out.println(Thread.currentThread().getName() + ":" + str.charAt(i)); i++; try { str.notify(); str.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } str.notify(); } }, "1").start(); new Thread(() -> { synchronized (str) { while (i < str.length()) { System.out.println(Thread.currentThread().getName() + ":" + str.charAt(i)); i++; try { str.notify(); str.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } str.notify(); } }, "2").start(); }}
阅读全文
0 0
- 两道多线程打印题目
- 多线程练习题目--利用多线程打印数字
- 两道C++题目
- USACO 两道题目
- USACO 两道题目
- USACO 两道题目
- USACO 两道题目
- USACO 两道题目
- USACO 两道题目
- USACO 两道题目
- 两道趣味题目
- 两道设计题目~
- 两道SQL面试题目
- 两道百度面试题目
- USACO 1.2 两道题目
- 两道趣味题目解答
- 两道简单的题目
- 多线程题目
- CentOS6.5安装docker
- iOS UIWebview添加请求头的两种方式
- BDF2的部门维护页面修改
- C语言的作用
- HashMap HashTable LinkedHashMap TreeMap
- 两道多线程打印题目
- Apache Maven的插件概述
- bzoj 3574: [Hnoi2014]抄卡组 (字符串Hash)
- Map用法
- ECLIPSE 快捷键
- 组合模式Composite(结构型)
- 15、jQuery插件之slider幻灯片插件(可悬停控制)
- js实现跨域
- MarkdownView:Markdown 文档预览视图组件