Worker Thread等到工作来,来了就工作
来源:互联网 发布:什么是淘宝首页流量 编辑:程序博客网 时间:2024/04/29 20:01
Worker是“工人”的意思,worker thread pattern中,工人线程(worker thread)会一次抓一件工作来处理,当没有工作可做时,工人线程会停下来等待心得工作过来。
Worker Thread也叫做background thread,另外,也有人把视点放在管理工人线程的地方,称之为Thread Pool。
public class WorkerThreadTest { /** * @param args */ public static void main(String[] args) { Channel channel = new Channel(5); channel.startWorkers(); new WorkerClientThread("Alice", channel).start(); new WorkerClientThread("Bobby", channel).start(); new WorkerClientThread("Chris", channel).start(); }}class WorkerClientThread extends Thread{ private final Channel channel; private static final Random random = new Random(); public WorkerClientThread(String name,Channel channel){ super(name); this.channel=channel; } @Override public void run() { try{ for(int i=0;true; i++){ WorkerRequest request = new WorkerRequest(getName(),i); channel.put(request); Thread.sleep(random.nextInt(1000)); } }catch(InterruptedException e){ e.printStackTrace(); } }}class WorkerRequest{ private final String name; private final int number; private static final Random random = new Random(); public WorkerRequest(String name,int number){ this.name=name; this.number=number; } public void execute(){ System.out.println(Thread.currentThread().getName() + " executes " + this); try { Thread.sleep(random.nextInt(1000)); } catch (InterruptedException e) { e.printStackTrace(); } } @Override public String toString() { return "[Request from " + name + " No." + number + "]"; }}class Channel{ private static final int MAX_REQUEST=100; private final WorkerRequest[] requestQueue; private int tail; private int head; private int count; private final WorkerThread[] threadPool; public Channel(int threads){ this.requestQueue=new WorkerRequest[MAX_REQUEST]; this.head = 0; this.tail=0; this.count=0; threadPool=new WorkerThread[threads]; for(int i=0;i < threadPool.length;i++){ threadPool[i] = new WorkerThread("Worker-" + i, this); } } public void startWorkers(){ for(int i=0;i<threadPool.length;i++){ threadPool[i].start(); } } public synchronized void put(WorkerRequest request){ while(count>=requestQueue.length){ try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } requestQueue[tail]=request; tail=(tail+1)%requestQueue.length; count++; notify(); } public synchronized WorkerRequest take(){ while(count<=0){ try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } WorkerRequest request = requestQueue[head]; head=(head+1)%requestQueue.length; count--; notify(); return request; }}class WorkerThread extends Thread{ private final Channel channel; public WorkerThread(String name, Channel channel){ super(name); this.channel=channel; } @Override public void run() { while(true){ WorkerRequest request = channel.take(); request.execute(); } }}
0 0
- Worker Thread等到工作来,来了就工作
- 刚说工作,机会就来了
- 工作了,没有时间来这儿了```
- 到广州来了,找不到工作!
- 来北京工作了,有写感慨
- “狼来了”之一:工作如战争
- 【工作记录】大北京,我来了~
- 困了就来
- 杨杰:来硅谷工作
- 来硅谷工作
- 杨杰:来硅谷工作
- 工作2年多了,我又来了
- 工作了,总少不了饭局的,抄来学习学习
- 狼来了:AI到底会不会抢走我们的工作?
- 就这样秋天来了
- 2012,就这样,来了,
- 工作来的第一次加班
- 工作来的第一次总结
- 浅析天购免费抢购商城是如何进行推广的?
- OCP 1Z0 051 64
- MySQL教程之error 150错误提示解决办法
- 赵雅智:Android短信发送器
- 23种设计模式
- Worker Thread等到工作来,来了就工作
- 计算矩阵运算的乘法次数
- Hypertable工具之csdump
- 三 100万并发连接服务器笔记之测试端就绪
- WPF DataGrid设置行的格式背景
- 如何解包/编辑/打包boot.img文件
- 从“添益宝”到“话费宝”,三大运营商加码互联网金融
- goldengate版本升级( from v10.4 to v11.1.1.1.0.29)
- 2D Graph ActiveX Control