Java 如何在我自己的线程池实现中使用Future和Callable

Java 如何在我自己的线程池实现中使用Future和Callable,java,multithreading,thread-safety,future,callable,Java,Multithreading,Thread Safety,Future,Callable,我试图用Java实现我自己的线程池(出于教学目的) 在我的线程池类中,我有以下方法: public Future submit (Task task) { //(Task implements Callable<String>) FutureTask<String> futureTask = new FutureTask<String>(task); taskQueue.put(task); //It is a BlockingQueue

我试图用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;
}
我如何使用Future和Callable在逻辑上是否有问题?


我的意思是一个任务在一个线程中被包装到一个FutureTask中,但它在另一个线程中被调用。由于某些原因,futureTask.get()无法获取task.call()的返回值。

愚蠢的问题,您是否在任何地方调用FutureTusk.run()?不,run()只是我线程的代码。他们只是接受一个任务并使用call()执行它。我的假设是,由于我将任务包装到FutureTask中,FutureTask.get()将知道task.call()何时结束。也许我这里出了点问题。你的代码不能看起来像是你发布的。您正在将
FutureTask
的实例放入队列,因此不可能在另一端检索自定义
Task
类的实例。如果工作线程正确地
从队列中获取(
Runnable
FutureTask
,则不再存在歧义,它们必须调用
run()
,因为没有
call()
。此外,如果您的线程具有如图所示的逻辑,即仅执行单个任务,则每次提交新任务时都必须启动一个新线程,否则,早晚都不会有工作线程运行。愚蠢的问题,您是否在任何地方调用FutureTusk.run()?不,run()只是我线程的代码。他们只是接受一个任务并使用call()执行它。我的假设是,由于我将任务包装到FutureTask中,FutureTask.get()将知道task.call()何时结束。也许我这里出了点问题。你的代码不能看起来像是你发布的。您正在将
FutureTask
的实例放入队列,因此不可能在另一端检索自定义
Task
类的实例。如果工作线程正确地
从队列中获取(
Runnable
FutureTask
,则不再存在歧义,它们必须调用
run()
,因为没有
call()
。此外,如果您的线程具有如图所示的逻辑,即仅执行单个任务,则每次提交新任务时都必须启动一个新线程,否则,早晚都不会有工作线程运行。愚蠢的问题,您是否在任何地方调用FutureTusk.run()?不,run()只是我线程的代码。他们只是接受一个任务并使用call()执行它。我的假设是,由于我将任务包装到FutureTask中,FutureTask.get()将知道task.call()何时结束。也许我这里出了点问题。你的代码不能看起来像是你发布的。您正在将
FutureTask
的实例放入队列,因此不可能在另一端检索自定义
Task
类的实例。如果工作线程正确地
从队列中获取(
Runnable
FutureTask
,则不再存在歧义,它们必须调用
run()
,因为没有
call()
。除此之外,如果线程具有如图所示的逻辑,即仅执行单个任务,则每次提交新任务时都必须启动新线程,否则,迟早不会有工作线程运行。
   Future<String> futureTask = threadPool.submit(new Task(/*arguments*/));
   //In theory, I could do something else here
   String taskRes = futureTask.get();
public void run() {
  Task task = taskQueue.take();
  task.call();
}