【问题标题】:Should I use ExecutorService?我应该使用 ExecutorService 吗?
【发布时间】:2012-06-07 06:38:00
【问题描述】:

在我的应用程序中,我正在执行一堆 SQL 查询,如作业和执行的详细信息,它们被插入到表中。插入任何记录后,侦听​​器应立即将其拾取并开始监视执行状态并更新同一张表中的状态。

我的前端已经准备就绪,直到现在我能够执行作业(多个查询)并将详细信息插入表中。现在我想捕获执行状态,并且我应该能够结束、暂停、重新启动执行。

当我经历多线程部分时,我遇到了 ExecutorService。

我的问题是我应该使用 ExecutorService 执行此操作吗?还是有其他方法?

请分享任何教程链接。

【问题讨论】:

    标签: java multithreading concurrency parallel-processing executorservice


    【解决方案1】:

    在您的情况下,我认为您可以使用 ExecutorService 并在 Callable 对象中创建作业,这将帮助您以 Future objects 的形式获取正在运行的作业的状态。

    对于教程我更喜欢this,它有关于并发包的基本信息。

    【讨论】:

      【解决方案2】:

      我使用 ExecutorService 来运行并行单元测试。并发现它非常成功。所以我建议你使用它。参考this

      【讨论】:

        【解决方案3】:

        也许我的问题的答案可以帮助捕获任务的状态。

        how-to-get-to-futuretask-execution-state

        虽然 Executors 框架非常强大,几乎可以在任何情况下使用, 也许你应该看看像Quartz 这样的并发库,如果使用 Executors 已经解决了,你会遇到很多问题。

        【讨论】:

          【解决方案4】:

          是的。您可以通过ExecuteServiceCallableFuture 来实现此目的。

          示例代码:

          import java.util.concurrent.*;
          import java.util.*;
          import java.util.Random;
          
          public class CallableDemo{
              public CallableDemo(){
                  System.out.println("creating service");
                  ExecutorService service = Executors.newFixedThreadPool(10);
          
                  System.out.println("Start");
                  List<MyCallable> futureList = new ArrayList<MyCallable>();
                  for ( int i=0; i<10; i++){
                      MyCallable myCallable = new MyCallable();
                      Future future = service.submit(myCallable);
                      try{
                          System.out.println("future.isDone = " + future.isDone());
                          /* You can use future.get() blocking call set time out*/
                          System.out.println("future: call ="+future.get());
                      }
                      catch (CancellationException ce) {
                          ce.printStackTrace();
                      } catch (ExecutionException ee) {
                          ee.printStackTrace();
                      } catch (InterruptedException ie) {
                          Thread.currentThread().interrupt(); // ignore/reset
                      }
                  }       
                  service.shutdown();
              }
              public static void main(String args[]){
                  CallableDemo demo = new CallableDemo();
              }
              class MyCallable implements Callable<Long>{
                  Long result = 0L;
          
                  public MyCallable(){
          
                  }
                  public Long call(){
                      // Add your business logic
                      // set the result
                      return result;
                  }
              }
          }
          

          重点说明:

          1. future.get() 在 Callable 任务计算后返回。您可以阻止直到 Callable 完成,也可以为其设置超时时间。
          2. 如果收到InterruptedException,请中断当前线程并继续。
          3. 别忘了致电shutdown()

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2023-03-09
            • 2011-12-26
            • 2021-12-10
            • 2010-12-25
            • 2014-05-27
            • 2010-12-25
            • 2018-09-11
            相关资源
            最近更新 更多