有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

多线程使用依赖线程工作线程在Java中调度定期作业?

这是我的要求的简化版本

我有一个java类say Processor,它包含一个方法say bigProcess(),它所做的只是连接到一个文件服务器,下载一个指定的文件,完成后将文件保存在DB中,然后更新不同表中的一些DB字段

对于每个子任务,如下载文件、在数据库中保存、在t1中更新字段等,它都使用不同的方法

processor类每2小时调用一次,每次调用大约需要处理30到40个请求。为了提高性能,我计划为每个请求跨一个新线程(这里是30到40个线程),每个线程调用bigProcess方法

现在我的问题是,我是否需要同步bigProcess()方法中的任何代码块(这里我担心的是update fields方法。一些更新方法是do lock一行,如selecte f1、f2、f3 from t1 for update,设置字段f1、f2和f3的值,并发出commit)

注意:方法bigProcess()不使用类处理器的任何实例变量


共 (2) 个答案

  1. # 1 楼答案

    是否需要同步方法取决于这些方法的实际功能。通常,如果有多个线程使用的资源,例如数据库中的一个文件或一个表(您实际上正在对其进行写入和读取),则需要进行同步。如果您正在运行的所有进程都不相互干扰,那么就不需要同步

  2. # 2 楼答案

    让BigProcess成为^{}。当你把它提交给一个^{}^{}时,你会得到一个^{}。如果在30-40个线程中执行^{},这些线程将阻塞,直到Callable完成。或者,如果Callable已完成,他们将立即返回结果

    另一种方法(我非常喜欢)是创建一个线程池,将所有工作提交到线程池。提交所有工作后,关闭并等待终止。它看起来像这样:

    ExecutorService threadPool = Executors.newFixedThreadPool(40);
    // submit work
    threadPool.shutdown();
    try {
      threadPool.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
    } catch (InterruptedException e) {
      // do something
    }
    

    如果您有相关的工作(比如任务B在任务A完成之前无法完成),那么使用任务A中的Future创建任务B,依此类推

    我喜欢这种方法,因为一切都是短暂的。对于来自数据库的单个加载,所有进程都将被创建、运行并丢弃。当您开始创建持久性线程池时,会引入另一个潜在的问题,并且很难确定发生了什么