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