【华为OJ】【094-多线程】
2016-05-21 06:42
357 查看
【华为OJ】【算法总篇章】
【华为OJ】【094-多线程】
【工程下载】
题目描述
问题描述:有4个线程和1个公共的字符数组。线程1的功能就是向数组输出A,线程2的功能就是向字符输出B, 线程3的功能就是向数组输出C,线程4的功能就是向数组输出D。要求按顺序向数组赋值ABCDABCDABCD, ABCD的个数由线程函数1的参数指定。
输入描述:
输入一个int整数
输出描述:
输出多个ABCD
输入例子:
10
输出例子:
ABCDABCDABCDABCDABCDABCDABCDABCDABCDABCD
算法实现
import java.util.LinkedList; import java.util.List; import java.util.Scanner; import java.util.concurrent.atomic.AtomicInteger; /** * Author: 王俊超 * Date: 2016-05-03 11:25 * CSDN: http://blog.csdn.net/derrantcm * Github: https://github.com/Wang-Jun-Chao * Declaration: All Rights Reserved !!! */ public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); while (scanner.hasNext()) { int n = scanner.nextInt(); for (int i = 0; i < n; i++) { System.out.print("ABCD"); } System.out.println(); } scanner.close(); } //////////////////////////////////////////////////////////////////////////////////////////////////// // TODO 应用使用下面的方法进行操作 //////////////////////////////////////////////////////////////////////////////////////////////////// /** * 打印线程 */ public static class WriteThread extends Thread { // 打印次数 private final int times; // 线程名称 private final String name; // 打印顺序变量 private final AtomicInteger order; // 当前线程的特别标识 private final int flag; // 所有的线程数 private final int all; // 保存结果 private final StringBuilder builder; public WriteThread(int times, String name, AtomicInteger order, int flag, int all, StringBuilder builder) { this.times = times; this.name = name; this.order = order; this.flag = flag; this.all = all; this.builder = builder; } @Override public void run() { int count = 0; // 一直输出到指定次数 while (count < times) { // 判断是否轮到自己输出 if (order.get() == flag) { // 输出计数加一 count++; // 输出内容 builder.append(name); // 指定下一个线程进行输出 order.set((flag + 1) % all); } } } } public static void main2(String[] args) throws InterruptedException { Scanner scanner = new Scanner(System.in); // Scanner scanner = new Scanner(Main2.class.getClassLoader().getResourceAsStream("data.txt")); // 读取并保存所有的输入 List<Integer> input = new LinkedList<>(); while (scanner.hasNextLong()) { input.add(scanner.nextInt()); } // 计算结果 List<StringBuilder> result = new LinkedList<>(); for (int num : input) { StringBuilder builder = new StringBuilder(); result.add(builder); AtomicInteger order = new AtomicInteger(0); WriteThread a = new WriteThread(num, "A", order, 0, 4, builder); WriteThread b = new WriteThread(num, "B", order, 1, 4, builder); WriteThread c = new WriteThread(num, "C", order, 2, 4, builder); WriteThread d = new WriteThread(num, "D", order, 3, 4, builder); a.start(); b.start(); c.start(); d.start(); a.join(); b.join(); c.join(); d.join(); } for (StringBuilder b : result) { System.out.println(b); } scanner.close(); } }
相关文章推荐
- js 遍历json
- 【华为OJ】【093-从单向链表中删除指定值的节点】
- Ps回调通知例程、Dpc定时器、内核线程使用方法.
- 【华为OJ】【092-学英语】
- 一个PsSetLoadImageNotifyRoutine回调内核注入DLL,支持xp ~ win7源码
- 文件上传小技巧/原生态【html篇】
- LeetCode 52. N-Queens II(N皇后)
- 如何在Windows 7平台搭建Android Cocos2d-x3.2alpha0开发环境(官方)
- 【华为OJ】【091-数据分类处理】
- Apache Ant安装与配置
- 登堂入室
- LeetCode 51. N-Queens(N皇后)
- LeetCode 50. Pow(x, n)(求幂)
- 源码推荐(0521):弹幕,超炫的点赞动画,网易新闻
- 十天冲刺开发第三天个人工作总结
- 得到汉字拼音首字母
- LeetCode 49. Group Anagrams(分组同构异形词)
- 计算机程序的构造和解释 练习 1.31
- 国家明确规划重点软件和集成电路设计领域
- leetcode %15 in cpp