java - 如何在执行线程(如分页)时获取回调

标签 java multithreading

我正在使用线程和线程池。线程开始执行,在执行时,它将任务提交到线程池。线程从线程池中检索大量数据,所以我想要像分页概念这样的数据。我怎样才能实现它?

我已经实现了像下面的程序一样的回调。

public class TestAsync implements TaskCallBack {
    public static ExecutorService exService = Executors.newFixedThreadPool(5);
    public static void main(String args[]) throws InterruptedException, ExecutionException{
        Task t1 = new Task();
        t1.doTask(new TestAsync());

    }

    public static ExecutorService getPool(){
        return exService;
    }

    @Override
    public void taskCompleted(String obj) {
        System.out.println(obj);
    }
}

class Task {
 public void doTask(TaskCallBack tcb) throws InterruptedException, ExecutionException{
     FutureTask<String> ft = new FutureTask<>(new Task1());
     TestAsync.getPool().execute(ft);
     tcb.taskCompleted(ft.get());
 }

}

class Task1 implements Callable<String>{

    @Override
    public String call() throws Exception {
        System.out.println(Thread.currentThread().getName());   
        /*
               Here code for data retrieval

        */

        return "done";
    }

  interface TaskCallBack{
      public void taskCompleted(String obj);
  }

}

在上面的程序中,我正在等待整个执行。我不想那样。

最佳答案

您不应等待 get() 调用完成。如果这样做,您将阻塞调用者线程。

来自JavaDocs :

Waits if necessary for the computation to complete, and then retrieves its result.

相反,类似的东西可能对您有用:

class Task1 implements Callable<String> {
    private final TaskCallBack callback;

    // Pass the callback to the task
    public Task1(TaskCallBack callback) {
        this.callback = callback;
    }

    @Override
    public String call() throws Exception {
        System.out.println(Thread.currentThread().getName());
        /* Here code for data retrieval */

        // When the task has completed, return the result via the callback.
        // This will not be in the caller thread - it will instead be async
        callback.taskCompleted(result);

        return "done";
    }
}

并且,初始化它(并调用它):

FutureTask<String> ft = new FutureTask<>(new Task1(myCallback));
TestAsync.getPool().execute(ft);

关于java - 如何在执行线程(如分页)时获取回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28314886/

相关文章:

java - 如何在 bundle 中传递 list<>

C# 与 Java - 通用列表

java - JMeter - 同时有多个请求但具有不同的值

c# - 快速多线程问题

java - Zookeeper cfg 文件 - 为什么有多个端口?

java - 在没有 http 的 WebView 中加载 URL ://www prefix

java - 如何将 JSONObject 转换为 ArrayList

c# - 从 wp8 应用程序中的单独线程更新 UI

java - 这是 Java 中 AtomicReference 的正确用例吗?

java - 非法监控状态异常