gpt4 book ai didi

java - Runnable 和 ExecutorService 的奇怪行为

转载 作者:行者123 更新时间:2023-12-01 14:36:24 24 4
gpt4 key购买 nike

我在多线程方面遇到了一些非常奇怪的行为。我有两个类:DipoleTester 和 Dipole。

DipoleTester 尝试创建多个 Dipole 对象,然后异步运行它们。问题是 DipoleTester 只是一次运行所有 Dipole 对象,而不是一次运行 2 个。

这是 DipoleTester:

public class DipoleTester {
public static String DIR = "./save/";
public static void main(String[] args) throws InterruptedException {
Dipole trial;
ExecutorService service = Executors.newFixedThreadPool(2);

for (int r = 10; r < 13; r += 1) {
double radius = (double) r / 10000.0;
for (int matType = 0; matType < 3; matType++) {
String name = "Simple_mat"+matType + "_rad" + radius;
trial = new DipoleSimple(DIR + "Simple/", name);
trial.materialType = matType;
trial.RADIUS = radius;
service.submit(trial);

}
}
service.shutdown();
service.awaitTermination(100, TimeUnit.HOURS);
}
}

这是来自偶极子的(相关位)

public abstract class Dipole implements Runnable{
...
public void run() {
initiate();
}
public void initiate() {
DateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
Date date = new Date();
System.out.println(dateFormat.format(date) + ": Starting: " + NAME);
model = ModelUtil.create(NAME);
model.modelNode().create("mod1");
makeParams();
makeVariables();
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
...
}

现在的问题是所有线程都会同时执行,即使使用了 thread.sleep(5000)!我不知道发生了什么事。这是控制台输出:

05/08/2013 19:17:31: Starting: Simple_mat0_rad0.001
05/08/2013 19:17:31: Starting: Simple_mat1_rad0.001
05/08/2013 19:17:31: Starting: Simple_mat2_rad0.001
05/08/2013 19:17:31: Starting: Simple_mat0_rad0.0011
05/08/2013 19:17:31: Starting: Simple_mat1_rad0.0011
05/08/2013 19:17:31: Starting: Simple_mat2_rad0.0011
05/08/2013 19:17:31: Starting: Simple_mat0_rad0.0012
05/08/2013 19:17:31: Starting: Simple_mat1_rad0.0012
05/08/2013 19:17:31: Starting: Simple_mat2_rad0.0012

最佳答案

您的Runnable任务在调用Thread.sleep()之前抛出异常。这允许下一个任务开始执行。所有任务都如此快速地连续失败,以至于所有任务似乎同时运行。

将调用 Thread.sleep() 作为您在 run() 方法中执行的第一件事,您将看到一次只有两个线程运行。

要检测此类故障,您需要examine Future每次调用 submit() 都会产生一个实例。有other methods for submitting a list of tasks批量并等待它们完成,这可能更适合您的应用程序。

关于java - Runnable 和 ExecutorService 的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16451845/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com