2

我正在做一个项目,我将从多线程代码中生成多个线程。

假设我正在生成 10 个线程,那么我需要确保每个线程都应该运行特定的持续时间。

例如,如果我想each thread运行 for 30 minutes,那么在config.properties文件中,我将拥有TOTAL_RUNNING_TIME=30

所以我想出了下面的设计来确保每个线程都在运行30 minutes

private static long durationOfRun;
private static long sleepTime;

 public static void main(String[] args) {

      // create thread pool with given size
      ExecutorService service = Executors.newFixedThreadPool(threads);

      try {

           readPropertyFile();

           for (int i = 0; i < threads; i++) {
                service.submit(new ReadTask(durationOfRun, sleepTime));
           }
      }
 }

 private static void readPropertyFile() throws IOException {
      prop.load(Read.class.getClassLoader().getResourceAsStream("config.properties"));

      threads = Integer.parseInt(prop.getProperty("NUMBER_OF_THREADS"));
      durationOfRun = Long.parseLong(prop.getProperty("TOTAL_RUNNING_TIME"));
      sleepTime = Long.parseLong(prop.getProperty("SLEEP_TIME"));
 }

下面是我的 ReadTask 类。

class ReadTask implements Runnable {
     private long durationOfRun;
     private long sleepTime;

     public ReadTask(long durationOfRun, long sleepTime) {
          this.durationOfRun = durationOfRun;
          this.sleepTime = sleepTime;
     }

     @Override
     public void run() {

          long startTime = System.currentTimeMillis();
          long endTime = startTime + (durationOfRun*60*1000);

          //Each thread is running less than endTime
          while(System.currentTimeMillis() <= endTime) {

               //Do whatever you want to do

          }

     Thread.sleep(sleepTime);
     }
}

如果你看看我的运行方法,我有一个 while 循环来检查时间。那么这种让每个线程运行特定持续时间的方法是否正确?或者还有什么更好的方法吗?如果还有其他更好的方法,请忽略我的无知,或者这也可以达到目的?

让我知道这里是否还有任何线程安全问题?

我正在寻找的是每个线程应该运行 30 分钟,如果该线程的时间已经结束,那么完成它当前正在运行的任务,之后不要再做任何其他事情,就像我们shutdownExecutorService. 如果有比这更好的方法或更好的设计。请给我一些例子,以便我可以从我的知识角度学习这些东西。谢谢您的帮助。

更新:-

如果您在 run 方法中查看我的 while 循环,在该 while 循环中,我将尝试创建一个Select call to the database. 所以我正在寻找的是这样的 - 一旦该线程的时间完成,它就不会对数据库进行任何其他选择调用并完成它之前所做的任何事情。就像shutdownExecutorService.

而且我不希望出现这种情况 - 一旦该线程的时间结束,它可能会使线程超时,该特定线程在那段时间正在对数据库进行选择?

4

2 回答 2

1

我对这种设计的担忧之一是,如果在 while 循环中完成的工作量比我们的时间更多,那会怎样?

例如

while(System.currentTimeMillis() <= endTime) {

    calaculateTheMeaningOfLife();

}

现在会发生什么?是什么停止了线程,或者鼓励它检查超时?如果您有阻塞操作,例如文件或套接字读/写,也会发生同样的事情

您可以尝试中断线程,但不能保证这会有所帮助

于 2013-02-24T02:12:33.480 回答
0

您可以为执行者设置时间限制。您需要强制转换 Executors 返回的 executor 并设置时间限制:

ThreadPoolExecutor service = (ThreadPoolExecutor) Executors.newFixedThreadPool(4);
service.setKeepAliveTime(1800, TimeUnit.SECONDS);

摘自 Brian Goetz 的“Java 并发实践”。

于 2013-02-23T22:34:53.590 回答