Java 实现具有固定大小任务列表的池
我想创建一个简单的模拟,我需要一个线程池,所以我决定写一个。我的界面如下:Java 实现具有固定大小任务列表的池,java,multithreading,asynchronous,concurrency,threadpool,Java,Multithreading,Asynchronous,Concurrency,Threadpool,我想创建一个简单的模拟,我需要一个线程池,所以我决定写一个。我的界面如下: public interface ThreadPool { public void start(); public int getTaskListSize(); public void addTask(Task task); public Task getNextTask(); } 最重要的是,任务列表的大小是有限的,当有人试图在任务已满的情况下向其中添加任务时,他会被阻止并等待该对象。
public interface ThreadPool {
public void start();
public int getTaskListSize();
public void addTask(Task task);
public Task getNextTask();
}
最重要的是,任务列表的大小是有限的,当有人试图在任务已满的情况下向其中添加任务时,他会被阻止并等待该对象。然而,在我的实现中,想要获取NextTask的线程通过notifyAll调用彼此唤醒,这是不好的
@Override
public void addTask(Task task) {
synchronized (tasks) {
tasks.add(task);
log("task list size:" + tasks.size());
}
synchronized (this) {
notifyAll();
}
}
@Override
public Task getNextTask() {
Task task;
synchronized (tasks) {
task = tasks.poll();
}
synchronized (this) {
notifyAll();
}
return task;
}
有没有一个干净的方法来解决这个问题?我使用ArrayBlockingQueue来保存任务
从线程调用addTask是:
protected void addTask(Task task, ThreadPool threadPool) {
while (true) {
try {
log("trying to add " + task);
threadPool.addTask(task);
log("added " + task +"!");
return;
} catch (IllegalStateException ex) {
log("adding failed, waiting");
synchronized(threadPool) {
threadPool.wait()
}
}
}
}
只是想知道:为什么要实现Java库中已经存在的东西?你是否研究了相应的课程,发现它们不是你所需要的?问这个问题是因为:通常情况下,Java附带的东西都是经过良好设计和测试的;那么,为什么要花时间重新发明轮子呢?因为我想深入了解东西是如何工作的。ArrayBlockingQueue是线程安全的,正如其名称所示,它是阻塞的。不需要在上面同步。不确定为什么getNextTask是公共的,以及notifyAll调用的用途。还有,你为什么要重新发明轮子?Java有一个线程池实现。notifyAll用于此线程池中的线程,因为它们位于线程池之外。实际上,我不必在数组上同步。阻塞队列将自动通知在getNextTask上阻塞的线程。一切都是无用的。顺便说一句,notifyAll用于提取在同一锁上的等待调用中被阻止的线程,并且代码中没有任何线程。