多线程初始化同步

时间:2017-06-30 17:29:33

标签: java multithreading

我可以在这里征求意见。

我在我的类的构造函数中创建了几个线程,因为我遇到了性能问题,因为我想添加更多的系列和流程。然而,这些线程需要随机时间进行初始化,这意味着代码仍然执行,抛开我的数组列表的顺序现在搞砸了,当代码继续执行时它没有完全加载。

Series是一个包装器,它可以添加监听器并简化输出我的框架在面板中实例化图表所需的一系列ArrayList。

在这里继续进行的正确方法是什么。我觉得我做错了。

    new Thread(new Runnable() {
        public void run() {
            Flow flow = new Flow(idThread, 1);
            flows.add(flow);
            series.add(new Series(3000, ProcessingType.NONE, flow, controller));
            series.add(new Series(5000, ProcessingType.FILTER, flow, controller));
        }
    }).start();

    new Thread(new Runnable() {
        public void run() {
            Flow flow = new Flow(idThread, 2);
            flows.add(flow);
            series.add(new Series(4000, ProcessingType.NONE, flow, controller));
            series.add(new Series(5000, ProcessingType.FILTER, flow, controller));
        }
    }).start();

    Global.getInstance().mySeries(idThread, series);
    trading = new Trading(idThread);

我天真地尝试了

while (series.size()<10){
        try {
            Thread.sleep(10);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

然而&#34;逻辑上&#34;主线程应该睡眠并留出时间让其他的初始化?

由于

2 个答案:

答案 0 :(得分:1)

不要扩展Thread,实施Runnable。除非你真的喜欢奇怪的错误,否则不要从构造函数中启动新线程。您可以使用各种同步惯用语,例如https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CountDownLatch.html来“在比赛前将马匹排在门口”。

答案 1 :(得分:0)

您可以使用CyclicBarrier,您可以在main中调用await()方法,直到所有线程都到达此屏障,主线程将等待。

http://tutorials.jenkov.com/java-util-concurrent/cyclicbarrier.html

相关问题