线程池的设计问题

每一个线程一旦运行其start()这个方法,那个这个线程是否就不可重复利用?
我想问的是怎么让线程可以复用? 实现的时候需要怎么处理?

提前开一个线程,然后在run()里面使用wait(),直到获得了下一个可以运行的runnable实力,然后notify()。重点是第一个线程始终在while(true)里面循环不退出。

public void run() {
Runnable r;
while (true) {
synchronized(queue) {
while (queue.isEmpty()) {
try
{
queue.wait();
}
catch (InterruptedException ignored)
{
}
}
//人物队列出栈。
r = (Runnable) queue.removeFirst();
}
try {
r.run();
}
catch (RuntimeException e) {
// You might want to log something here
}
}
假如这样的线程有5个就样这样的5个线程不断得去监测任务队列里是不是有待完成的任务是吧?
对不对? 那如果发现5个不够用的话 怎么样动态增加呢?
[该贴被littlenewus于2009-02-17 22:07修改过]

基本上对了,只是还有一点点问题,就是执行器的归属和控制。自动取得任务是一种简单的有效地方式,但是对于池这样的机构此种方式太简单了不足以进行管理。

参考以下的实现方式。

class Pool
{
Runner r;
public void execute(Runnable task)
{
r.setTask(task);
r.notifyAll();
}
}

class Runner implements Runnable
{
protected Runnable task;

public void setTask(Runnable task)
{
this.task = task;
}

public void run()
{
while(true)
{
try
{
if(this.task != null)
{
task.run();
this.task = null;
}
else
{
synchronized(this)
{
this.wait()
}
}
}
catch(Exception e)
{}
}
}
}

嗯 有点明白 还有不懂的是那个实现了Runnable 的task类里面实现的run()方法是具体要做的逻辑吧 平时我们都是
new Thread(Runnable).start();
这样来启动线程的 但是这里的task.run()是直接调用里面的run()方法 run()当成普通方法来用了? 这里不是很懂。

Thread.start()最重要的事情就是Runnable.run(),我们的线程池只需要做同样的事情。线程池子的目的是预先创建和维护资源,免去了反复的创建的消耗。

如果你能够明白一点点了,用2-3天的时间安静的思考一下,也可以做一个原型尝试运行一下,然后再带着问题来看看这个帖子,相信你可以获得一些收获的。

嗯 再把你的代码想了想
Thread.start()是正常启动线程 线程就进入了一种不可控的状态,直到传进去的Runnable的run()结束为止。线程停止。

通过setTask(task)这里唤醒Runner里面的run()方法,从而不断得去检测是否有新任务,有就执行它本身多实现的run(),没有就继续等待。。感觉是在用notifyAll()和wait()来实现调度。。这样理解靠谱不?

靠谱,靠谱了。
线程池的实现可以有多种形式但道理就是这样的了。上面的代码肯定是不能实际使用的,有个严重的缺陷。

这些还是表面现象,还差一步就接触到核心了。加油呀!

嗯 谢谢指点。。继续学习。