14.线程面试题二
来源:互联网 发布:网络音响 编辑:程序博客网 时间:2024/06/16 01:45
现成程序中的Test类中的代码在不断地产生数据,然后交给TestDo.doSome()方法去处理,就好像生产者在不断地产生数据,消费者在不断消费数据。请将程序改造成有10个线程来消费生成者产生的数据,这些消费者都调用TestDo.doSome()方法去进行处理,故每个消费者都需要一秒才能处理完,程序应保证这些消费者线程依次有序地消费数据,只有上一个消费者消费完后,下一个消费者才能消费数据,下一个消费者是谁都可以,但要保证这些消费者线程拿到的数据是有顺序的。原始代码如下:
public class aa {public static void main(String[] args) {System.out.println("begin:" + (System.currentTimeMillis() / 1000));for (int i = 0; i < 10; i++) { // 这行不能改动String input = i + ""; // 这行不能改动String output = TestDo.doSome(input);System.out.println(Thread.currentThread().getName() + ":" + output);}}}// 不能改动此TestDo类class TestDo {public static String doSome(String input) {try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}String output = input + ":" + (System.currentTimeMillis() / 1000);return output;}}改进之后的代码:
import java.util.concurrent.Semaphore;import java.util.concurrent.SynchronousQueue;public class Test {public static void main(String[] args) {final Semaphore semaphore = new Semaphore(1);final SynchronousQueue<String> queue = new SynchronousQueue<String>();for (int i = 0; i < 10; i++) {new Thread(new Runnable(){public void run() {try {semaphore.acquire();String input = queue.take();String output = TestDo.doSome(input);System.out.println(Thread.currentThread().getName() + ":" + output);} catch (InterruptedException e) {e.printStackTrace();}semaphore.release();}}).start();}System.out.println("begin:" + (System.currentTimeMillis() / 1000));for (int i = 0; i < 10; i++) { // 这行不能改动String input = i + ""; // 这行不能改动//String output = TestDo.doSome(input);//System.out.println(Thread.currentThread().getName() + ":" + output);try {queue.put(input);} catch (InterruptedException e) {e.printStackTrace();}}}}// 不能改动此TestDo类class TestDo {public static String doSome(String input) {try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}String output = input + ":" + (System.currentTimeMillis() / 1000);return output;}}结果:
begin:1491224096Thread-4:0:1491224097Thread-0:1:1491224098Thread-8:2:1491224099Thread-2:3:1491224100Thread-6:4:1491224101Thread-3:5:1491224102Thread-7:6:1491224103Thread-1:7:1491224104Thread-5:8:1491224105Thread-9:9:1491224106
0 0
- 14.线程面试题二
- 线程面试题二
- 线程面试题之二:子线程之间的同步
- 每日5道面试题八(java线程二)
- [从面试题看问题]线程篇(二)
- Java面试题(二)多线程、线程同步
- 面试题之多线程
- 线程面试题一
- Android面试题:线程
- 线程面试题
- 进程,线程 - 面试题
- 线程面试题
- java线程面试题
- 线程、进程面试题
- java线程面试题
- 线程面试题
- 线程面试题
- java线程面试题
- 什么是框架
- stm32+DS1302+TM1638驱动程序
- so共享库
- 2015年第六届蓝桥杯C/C++程序设计本科B组省赛-移动距离
- Windows下编译breakpad (2)
- 14.线程面试题二
- 结束进程的常见方式
- Dubbo框架学习笔记(四)
- CentOS 环境变量编辑、保存、立即生效的方法
- 感知机随机梯度和梯度下降法区别
- ubuntu14.04 安装anaconda+pycharm+cuda+cudnn+theano0.90+keras2.0.2+tensorflow1.1.0
- gcc编译
- CCF NOI1009 分配任务
- 实验楼第四期楼赛