【问题标题】:Pause an ExecutorService in java在java中暂停一个ExecutorService
【发布时间】:2018-11-01 06:43:35
【问题描述】:

我有很多数据要处理并插入到一个列表中,然后我需要将此列表插入到我的数据库中,每次它里面有 100k 个字符串。将列表保存到数据库时如何暂停 ExecutorService? 可以锁吗?

我的问题的示例代码:

ExecutorService executor = Executors.newFixedThreadPool(threadAmount);
List <String> list = new ArrayList<>();
for(Object obj: ObjectList){
  objectThreadProcess dto = new ObjectThreadProcess(obj.toString(), obj.id);
  executor.submit(dto);
  executor.execute(dto);
  if(list.size() == 100000){
    //I need to pause threads here to not insert while I'm inserting into DB and creating a new list
    ObjDAO.largeInsert(list);
    list = new ArrayList<>();
  }
}

【问题讨论】:

  • executor.submit(dto); executor.execute(dto); - 为什么要提交两次任务?
  • 这是一个示例代码,没有计划,但感谢您的观察
  • 不,largeInsert 是 ObjDAO(它是一个静态类)中的一个方法,我在其中获取此列表并将插入到 DB 中

标签: java multithreading executorservice


【解决方案1】:

实际上,您不需要暂停 ExecutorService。您需要的是阻止尝试写入列表的线程,而不是暂停线程池。或者有一天你将写入数据库的任务放在那个线程池中,它会暂停线程池,包括它自己,整个进程就会挂起。

您可以简单地创建 2 种同步方法 - 一种写入列表,另一种从列表中读取,推送到数据库并清除它。在任何情况下都需要它们,因为列表是从不同的线程访问的。

【讨论】:

    猜你喜欢
    • 2016-05-24
    • 2012-08-08
    • 2012-04-02
    • 2011-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-22
    • 1970-01-01
    相关资源
    最近更新 更多