先上代码,从网上得来的,贴一下主要部分:
public final class ThreadPool
{
private static List<Task> taskQueue = Collections.synchronizedList(new LinkedList<Task>());
private ThreadPool()
{
workers = new PoolWorker[5];
for (int i = 0; i < workers.length; i++)
{
workers[i] = new PoolWorker(i);// 在线程池里生成多个线程并且全部进入启动状态
}
}
....
public void batchAddTask(Task[] taskes)
{
synchronized (taskQueue)
{
for (int i = 0; i < taskes.length; i++)
{
taskes[i].setTaskId(++taskCounter);
taskQueue.add(taskes[i]);
}
/* 唤醒队列, 开始执行 */
taskQueue.notifyAll();
} private class PoolWorker extends Thread
{
public void run()
{ while (isRunning)
{
Task r = null;
synchronized (taskQueue)// 加synchronized的作用是避免几个线程同时执行一个task
{
while (taskQueue.isEmpty())
{
try
{
taskQueue.wait(20);
}
catch (Exception ie)
{
}
} r = (Task) taskQueue.remove(0);
}
}}我不明白的地方是对于代码
while (taskQueue.isEmpty())
{
try
{
taskQueue.wait(20);
}
这一段,意思就是只要队列taskQueue为空就循环等待,我不明白为什么要加这个等待,只要为空就一直循环不就行了,之后不为空了应该自动跳出循环直接执行r = (Task) taskQueue.remove(0);不就完了吗...可是我把taskQueue.wait(20);去了后 ,循环一直退不出来,就是说一直没办法执行到 r = (Task) taskQueue.remove(0);语句....后来我认为是上面这段代码有问题
taskQueue.notifyAll();
因为当时觉得,队列赋值了就可以用了,还通知什么,就把这段也去了,结果
while (taskQueue.isEmpty())
{
try
{
}
这个循环还是没完没了...但是把这两段代码都加上就没有问题,程序可以正常运行,请高手指点,为什么会这样?为什么有了taskQueue.notifyAll();和 taskQueue.wait(20);程序就能正常运行呢?
public final class ThreadPool
{
private static List<Task> taskQueue = Collections.synchronizedList(new LinkedList<Task>());
private ThreadPool()
{
workers = new PoolWorker[5];
for (int i = 0; i < workers.length; i++)
{
workers[i] = new PoolWorker(i);// 在线程池里生成多个线程并且全部进入启动状态
}
}
....
public void batchAddTask(Task[] taskes)
{
synchronized (taskQueue)
{
for (int i = 0; i < taskes.length; i++)
{
taskes[i].setTaskId(++taskCounter);
taskQueue.add(taskes[i]);
}
/* 唤醒队列, 开始执行 */
taskQueue.notifyAll();
} private class PoolWorker extends Thread
{
public void run()
{ while (isRunning)
{
Task r = null;
synchronized (taskQueue)// 加synchronized的作用是避免几个线程同时执行一个task
{
while (taskQueue.isEmpty())
{
try
{
taskQueue.wait(20);
}
catch (Exception ie)
{
}
} r = (Task) taskQueue.remove(0);
}
}}我不明白的地方是对于代码
while (taskQueue.isEmpty())
{
try
{
taskQueue.wait(20);
}
这一段,意思就是只要队列taskQueue为空就循环等待,我不明白为什么要加这个等待,只要为空就一直循环不就行了,之后不为空了应该自动跳出循环直接执行r = (Task) taskQueue.remove(0);不就完了吗...可是我把taskQueue.wait(20);去了后 ,循环一直退不出来,就是说一直没办法执行到 r = (Task) taskQueue.remove(0);语句....后来我认为是上面这段代码有问题
taskQueue.notifyAll();
因为当时觉得,队列赋值了就可以用了,还通知什么,就把这段也去了,结果
while (taskQueue.isEmpty())
{
try
{
}
这个循环还是没完没了...但是把这两段代码都加上就没有问题,程序可以正常运行,请高手指点,为什么会这样?为什么有了taskQueue.notifyAll();和 taskQueue.wait(20);程序就能正常运行呢?
解决方案 »
- 反射中如何区分参数是基本类型还是所对应的包装类
- java编译提示类库缺少;
- 如何导入在JAVA面板运行时,导入默认的按钮图片
- classpath,packge
- keyTyped、keyPressed、keyReleased之间的区别是什么?
- 小弟想在linux下用java做一个单机版的信息管理系统,怎样入手比较好呢?
- 还是线程的问题,破玩意烦死我了。
- 怎么将JRE放在局域网内让客户端下载啊?
- 我在jb7中将应用程序编译成可执行文件,可是当我点击执行的时候,却提示错误错误信息为没有找到Java rrun time,然后给了我一个网址让我去
- 想写个程序能看到本机在网络通信过程中发出和接受的所有数据,如何实现?
- 数据库操作代码异常,请高手帮忙找问题所在。
- 插入排序代码实现思路
taskQueue.wait(20); 他的意思是让队列taskQueue自己阻塞20秒还是说让调用taskQueue.wait(20); 语句的线程 自己阻塞20秒?
线程池基本上是这样实现的:1:先 new 出固定数量的 Thread,类似于这样:Thread t0 = new Thread(new WorkRunnable());WorkRunnable 的结构基本上是这样的(实际远远比这复杂):public class WorkRunnable implements Runnable { private Runnable command; public WorkRunnable(Runnable command) {
this.command = command;
} public void run() {
command.run();
} public void setCommand(Runnable command) {
this.command = command;
}
}2:执行 t0.start() 可以执行线程,如果执行完了,将 WorkRunnable 中的 command 换一个再 start() 又可以执行了。基本上的思路就是这样,但是实现起来极其复杂,不建议自己写,了解一下就可以了。