这是我第一次尝试创建自己的线程池。该程序有效,除非我尝试停止所有线程。 我试图打断所有线程,但出于某种原因它会到达这个段:
if(this.currentThread()。isInterrupted())
这是输出:
添加了所有任务
任务5由线程0收到
这是任务#5
任务4由线程2收到
这是任务#4
任务3由线程1收到
这是任务#3
全部完成,线程池关闭了
任务5现在由线程0执行
任务2由线程0收到
这是任务#2
任务3现在由线程1执行
任务1由线程1收到
这是任务#1
任务4现在由线程2执行
没有可用的任务......
任务1现在由线程1执行
没有可用的任务......
任务2现在由线程0执行
没有可用的任务......
在调用stopPool()方法后,程序应该停止生成输出。
谁能告诉我这里出了什么问题?
public class CustomThread extends Thread
{
private int id;
private Task task;
private ThreadPool threadpool;
public CustomThread(int id, Task task, ThreadPool threadpool)
{
this.id = id;
this.task = task;
this.threadpool = threadpool;
}
public synchronized void run()
{
while(true)
{
if (this.currentThread().isInterrupted())
{
System.out.println("Thread " + id + " is halted");
}
else
{
if (threadpool.getTaskQueue().isEmpty())
{
System.out.println("No available tasks...");
try
{
this.wait();
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
else
{
task = threadpool.retrieveTask();
System.out.println("Task " + task.getID() + " recieved by thread " + id);
task.run();
task.setState(true);
System.out.println("Task " + task.getID() + " now being executed by thread " + id);
}
}
}
}
public synchronized void wakeUp()
{
this.notify();
}
public int getThreadID()
{
return id;
}
}
import java.util.List;
import java.util.ArrayList;
import java.util.Stack;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
public class ThreadPool
{
private List<CustomThread> thread_list;
private Stack<Task> task_queue;
public ThreadPool(int threads)
{
thread_list = new ArrayList<CustomThread>();
task_queue = new Stack<Task>();
for(int i=0; i<threads; i++)
{
CustomThread thread = new CustomThread(i, null, this);
thread_list.add(thread);
thread.start();
}
}
//Must use notify() to wake up an idle thread
public synchronized void add(Task task)
{
task_queue.push(task);
try
{
for(CustomThread t : thread_list)
{
t.wakeUp();
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
public synchronized void stopPool()
{
for(CustomThread t : thread_list)
{
t.currentThread().interrupt();
}
}
public synchronized Stack getTaskQueue()
{
return task_queue;
}
public synchronized Task retrieveTask()
{
return task_queue.pop();
}
}
public class Task implements Runnable
{
private int id;
private boolean finished = false;
public Task(int id)
{
this.id = id;
}
public synchronized void run()
{
System.out.println("This is task #" + id);
try
{
Thread.sleep(1000);
}
catch (Exception e)
{
e.printStackTrace();
}
}
public int getID()
{
return id;
}
public void setState(Boolean finished)
{
this.finished = finished;
}
public boolean getState()
{
return finished;
}
}
public class Init
{
public static void main(String[] args)
{
ThreadPool threadpool = new ThreadPool(3);
threadpool.add(new Task(1));
threadpool.add(new Task(2));
threadpool.add(new Task(3));
threadpool.add(new Task(4));
threadpool.add(new Task(5));
System.out.println("All tasks added");
{
try
{
Thread.sleep(1000);
}
catch(Exception e)
{
e.printStackTrace();
}
}
threadpool.stopPool();
System.out.println("All done, threadpool closed");
}
}
答案 0 :(得分:3)
您的代码
t.currentThread().interrupt();
将重复中断当前线程,而不是线程t
尝试
t.interrupt();
BTW:我希望wait()
抛出一个异常,你记录并继续,好像它没有发生一样。
为了您的兴趣,您可以使用ExecutorService编写它。
ExecutorService service = Executors.newFixedThreadPool(3);
for (int i = 1; i <= 5; i++) {
final int id = i;
service.submit(new Callable<Void>() {
@Override
public Void call() throws Exception {
System.out.println("This is task #" + id);
Thread.sleep(1000);
return null;
}
});
}
System.out.println("All tasks added");
service.shutdown();
service.awaitTermination(1, TimeUnit.HOURS);
System.out.println("All done, threadpool closed");
打印
This is task #1
This is task #3
This is task #2
All tasks added
This is task #4
This is task #5
All done, threadpool closed