Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.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 具有Runnable和ExecutorService的奇怪行为_Java_Multithreading_Runnable_Executorservice - Fatal编程技术网

Java 具有Runnable和ExecutorService的奇怪行为

Java 具有Runnable和ExecutorService的奇怪行为,java,multithreading,runnable,executorservice,Java,Multithreading,Runnable,Executorservice,我在多线程中遇到了一些非常奇怪的行为。我有两门课:偶极子测试器和偶极子测试器 DipoleTester尝试创建多个偶极子对象,然后异步运行它们。问题是,偶极子测试器只是一次运行所有偶极子对象,而不是一次运行两个 这是双油测试仪: public class DipoleTester { public static String DIR = "./save/"; public static void main(String[] args) throws InterruptedExce

我在多线程中遇到了一些非常奇怪的行为。我有两门课:偶极子测试器和偶极子测试器

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);
    }
}
现在的问题是,所有线程都同时执行,即使是使用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()


要检测此类故障,您需要查看每次调用
submit()
所产生的实例。有大量的线程正在等待它们完成,这可能更适合您的应用程序。

因此您认为,由于线程池只有两个工作线程,这两个工作线程将立即锁定在睡眠中,其他任务将不得不等待?你在这里想干什么??如果你想让他们在时间上分散开来,为什么不使用调度服务呢?你确定它已经进入睡眠状态了吗?我对代码进行了一点精简以使其能够编译,并且它按照您的预期工作,运行了两个任务,然后在运行另外两个任务之前休眠了5秒钟。但我必须拿出一些代码来让它工作。也许它遇到了一个异常而从未进入睡眠状态?亲爱的@randomafk,
sleep(5000)
应该在每个循环后放入
DipoleTester
类中。。当睡眠在Runnable类中时,您不会从睡眠中受益,如果您想在每个线程之后启动
睡眠
,那么将
sleep(5000)
放在
service.submit(试用)
之后。另一件事是为什么不使用
service.execute(试用)
而不是
service.submit(试用)
同意这一点。我试着创建一个简单版本的OP的代码只是为了测试,它按照他的意图工作:同意以及根据我之前的评论:)非常感谢!我尝试使用callable和invokeAll()来代替,结果发现我使用的库到处抛出异常。。。知道为什么它可以作为一个单线程工作,但当我尝试同时运行它们时却不行吗?@randomafk我不知道为什么它不能同时工作。我需要更多的信息,比如,“不工作”是什么意思?抛出异常?堆栈跟踪将有所帮助。您使用的是哪一个图书馆?等,如果你打开一个新的问题,请随意评论这里再次与一个链接;我想看看。
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