Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 每个线程都应该运行特定的持续时间_Java_Multithreading_Executorservice - Fatal编程技术网

Java 每个线程都应该运行特定的持续时间

Java 每个线程都应该运行特定的持续时间,java,multithreading,executorservice,Java,Multithreading,Executorservice,我正在从事一个项目,在这个项目中,我将从一个多线程代码中产生多个线程 假设我正在生成10个线程,那么我需要确保每个线程都应该在特定的时间段内运行 例如,如果我希望每个线程都应该运行30分钟,那么在config.properties文件中,我将让TOTAL\u RUNNING\u TIME=30 因此,我提出了以下设计,以确保每个线程都能运行30分钟 private static long durationOfRun; private static long sleepTime; public

我正在从事一个项目,在这个项目中,我将从一个多线程代码中产生多个线程

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

例如,如果我希望
每个线程都应该运行
30分钟
,那么在
config.properties
文件中,我将让
TOTAL\u RUNNING\u TIME=30

因此,我提出了以下设计,以确保每个线程都能运行30分钟

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"));
 }
私有静态长时间运行;
私人静态长睡眠时间;
公共静态void main(字符串[]args){
//创建具有给定大小的线程池
ExecutorService=Executors.newFixedThreadPool(线程);
试一试{
readPropertyFile();
对于(int i=0;i
下面是我的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);
     }
}
class ReadTask实现可运行{
私人长假;
私人长时间睡眠;
公共读取任务(长时间运行,长睡眠时间){
this.durationOfRun=durationOfRun;
this.sleepTime=睡眠时间;
}
@凌驾
公开募捐{
long startTime=System.currentTimeMillis();
长结束时间=开始时间+(运行持续时间*60*1000);
//每个线程的运行时间都少于endTime

while(System.currentTimeMillis()您可以为执行器设置时间限制。您需要强制转换执行器返回的执行器并设置时间限制:

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

摘自Brian Goetz的“Java并发在实践中”一文。

我对该设计的一个关注点是,如果在while循环中完成的工作量比我们的时间花费更多,会怎么样

比如说

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

    calaculateTheMeaningOfLife();

}

while(System.currentTimeMillis()我看到的问题是,如果您有某种长时间运行或阻塞进程,这可能意味着线程将至少运行所需的运行时间,但可能会运行更长。您可以使用主线程,其唯一目的是在给定时间段后中断线程,但这假设子线程支持中断D程序员的建议。你能给我一些例子,我可以从中了解更多,这将实现我的问题场景。我不知道主线程将如何中断子线程。顺便问一下,MadProgrammer,你能更清楚地解释我,上面的设计有什么潜在的问题吗?对不起,我的无知ce.Thread.sleep(sleepTime);似乎没有任何有用的用途。而(System.currentTimeMillis()这并没有设置线程运行的时间限制。请参阅setKeepAliveTime()的JavaDoc.是的,你是对的。我错了。现在,仔细想想,突然强制关闭线程是没有意义的。谢谢Chuck。谢谢MadProgrammer的建议。我是如何理解这个while循环的。如果我错了,请纠正我。如果你在run方法中查看while循环,在while循环中,我将尝试生成e对数据库的Select调用。所以我认为这会发生,只要线程的时间结束,它就不会对数据库进行任何其他Select调用,也不会完成之前所做的任何操作。我说的对吗?如果是这样,那么这就是我要找的。是的,只要出于任何原因,没有任何东西阻止线程。Whi如果执行select调用,线程将无法处理超时。在最佳条件下,while循环将只保证线程将至少生存超时(我认为是30分钟)