首页 新闻 会员 周边

java多线程-主线程等待多个子线程处理结果,子线程结果不完整

0
悬赏园豆:15 [已解决问题] 解决于 2021-08-25 16:34

public class ThreadTest {

public static void main(String[] args) {
    System.out.println("main begin");
    CountDownLatch cunt = new CountDownLatch(5);
    List<String> out = new ArrayList<>();
    ExecutorService executorService = Executors.newFixedThreadPool(5);
    for (int i=0;i<5;i++){
        executorService.execute(new TaskTest(i+"",cunt,out));
    }
    try {
        cunt.await();
    }catch (Exception e){

    }
    executorService.shutdown();
    System.out.println(out);
    System.out.println("main out");
}

}
@Data
@NoArgsConstructor
@AllArgsConstructor
class TaskTest implements Runnable{

private String name;
private CountDownLatch countDownLatch;
private List<String> result;

@Override
public void run() {
    countDownLatch.countDown();
    result.add("11");
    System.out.println("thread:"+name);
}

}

主线程中打印的out理论上应该是:[11, 11, 11, 11, 11],但是会出现[null, 11, 11, 11, 11]或者[null, null, 11, 11, 11],是什么原因?

二毛605332的主页 二毛605332 | 初学一级 | 园豆:181
提问于:2021-08-24 17:28
< >
分享
最佳答案
0

new CountDownLatch(5);
改为
new CountDownLatch(6);

主线程也执行 countDown();
cunt.countDown();

试试。

收获园豆:15
快乐的凡人721 | 老鸟四级 |园豆:3959 | 2021-08-24 17:40

这个不行的

二毛605332 | 园豆:181 (初学一级) | 2021-08-24 17:50

@二毛605332:
多线程操作,涉及到 并发问题
List<String> out = new ArrayList<>();
不是 支持并发的。

快乐的凡人721 | 园豆:3959 (老鸟四级) | 2021-08-24 17:59

@二毛605332: 改为下面的:
List<String> out = Collections.synchronizedList(new ArrayList<>());

或者使用 Current开头的 List

快乐的凡人721 | 园豆:3959 (老鸟四级) | 2021-08-24 18:00
其他回答(2)
0

ArrayList的add不是線程安全的

加鎖解決
synchronized (TaskTest.class) {
result.add(name);
}

何耀堂 | 园豆:202 (菜鸟二级) | 2021-08-24 18:12
0

需要阻塞主线程
executorService.awaitTermination 执行这个

mowen285 | 园豆:672 (小虾三级) | 2021-08-24 18:21
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册