我正在尝试用Java实现我自己的线程池(用于教学目的)。
在我的线程池类中,我有这个方法:
public Future submit (Task task) { //(Task implements Callable<String>)
FutureTask<String> futureTask = new FutureTask<String>(task);
taskQueue.put(task); //It is a BlockingQueue
return futureTask;
}
我将Task包装到FutureTask中,将其放入同步队列并立即返回FutureTask。
当我尝试向池中添加任务时,我会这样做:
Future<String> futureTask = threadPool.submit(new Task(/*arguments*/));
//In theory, I could do something else here
String taskRes = futureTask.get();
我在一些线程上使用上面的代码,但futureTask.get()永远不会返回。
我的主题是这样的:
public void run() {
Task task = taskQueue.take();
task.call();
}
我使用Future和Callable的方式是否存在逻辑错误?
我的意思是在一个线程中将Task包装到FutureTask中,但在另一个线程中调用它。由于某些原因,futureTask.get()无法获取task.call()的返回值。