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 ExecutorService用于执行并行作业';行不通_Java_Multithreading_Executorservice - Fatal编程技术网

Java ExecutorService用于执行并行作业';行不通

Java ExecutorService用于执行并行作业';行不通,java,multithreading,executorservice,Java,Multithreading,Executorservice,我将ExecutorService用于一个简单的多线程应用程序,它只包含两个线程,但这两个线程都做了大量工作。(复制文件,mvn打包大型模块) 我的意图是并行地完成这两个任务,但这两个线程同时启动,我观察到一个线程启动,做一些工作,然后再次等待,直到另一个线程完成。我不明白为什么会这样。希望有人回答。:) 我的代码示例: ExecutorService executorService = Executors.newFixedThreadPool(2); Set<Future<V

我将ExecutorService用于一个简单的多线程应用程序,它只包含两个线程,但这两个线程都做了大量工作。(复制文件,mvn打包大型模块)

我的意图是并行地完成这两个任务,但这两个线程同时启动,我观察到一个线程启动,做一些工作,然后再次等待,直到另一个线程完成。我不明白为什么会这样。希望有人回答。:)

我的代码示例:

ExecutorService executorService = Executors.newFixedThreadPool(2);

  Set<Future<Void>> futureSet = new HashSet<Future<Void>>();

  public IX3InstallerThreadPool(List<Callable<Void>> threadList) throws MojoExecutionException
  {
    for (Callable<Void> thread : threadList)
    {
      futureSet.add(executorService.submit(thread));
    }

    execute();
  }

  private void execute() throws MojoExecutionException
  {
    boolean flag = false;
    for (Future<Void> future : futureSet)
    {
      try
      {
        future.get();
      }
      catch (InterruptedException e)
      {
        System.out.println("Interrupted");
      }
      catch (ExecutionException e)
      {
        System.out.println("Exception thrown from the thread");
        for (Future<Void> future1 : futureSet)
        {
          future1.cancel(true);
        }
        break;
      }
    }
  }
ExecutorService ExecutorService=Executors.newFixedThreadPool(2);
Set futureSet=新HashSet();
公共IX3InstallerThreadPool(列表threadList)引发MojoExecutionException异常
{
for(可调用线程:线程列表)
{
添加(executorService.submit(线程));
}
执行();
}
private void execute()引发MojoExecutionException异常
{
布尔标志=假;
for(未来:未来集)
{
尝试
{
future.get();
}
捕捉(中断异常e)
{
系统输出打印项次(“中断”);
}
捕获(执行例外)
{
System.out.println(“从线程抛出的异常”);
for(未来1:未来集)
{
未来1.取消(真);
}
打破
}
}
}

我在本地测试了您的代码,它似乎按照预期工作-我给了您的线程池一个包含两个可调用项的列表,每个可调用项每隔一秒钟打印出一个不同的单词。这些印刷品是交错的,就像我期望它们来自两条不同的线一样。您能否进一步说明这是如何不按预期执行的?您在两个可调用实现中执行的代码可能不支持多线程,并使用同步机制来防止多线程执行。因此,你提出了错误的密码。是的,我认为也是。在一个thred中,它有一个使用Runtime.getRuntime()的命令执行器,另一个是复制文件。然后我将其更改为使用process builder运行命令。然后问题就解决了。但我仍然无法理解这两种方法在执行过程中会产生不同的过程。