线程池的设计问题

09-02-17 littlenewus
每一个线程一旦运行其start()这个方法,那个这个线程是否就不可重复利用?

我想问的是怎么让线程可以复用? 实现的时候需要怎么处理?

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

littlenewus
2009-02-17 22:01
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修改过]

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

参考以下的实现方式。

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)

{}

}

}

}

littlenewus
2009-02-17 22:58
嗯 有点明白 还有不懂的是那个实现了Runnable 的task类里面实现的run()方法是具体要做的逻辑吧 平时我们都是

new Thread(Runnable).start();

这样来启动线程的 但是这里的task.run()是直接调用里面的run()方法 run()当成普通方法来用了? 这里不是很懂。

猜你喜欢
2Go 1 2 下一页