首页
题库
面试
求职
学习
竞赛
More+
所有博客
搜索面经/职位/试题/公司
搜索
我要招人
去企业版
登录 / 注册
首页
>
试题广场
>
上述代码能否保证所有Hello, DWD一定在Done Al
[问答题]
上述代码能否保证所有
Hello, DWD
一定在
Done All DWD
之前输出?如果不能,请尽可能多的提供方法来保证
查看答案及解析
添加笔记
求解答(0)
邀请回答
收藏(10)
分享
纠错
3个回答
添加回答
1
faith边
1.public static void main(String[] args) throws InterruptedException {
final CountDownLatch countDownLatch=new CountDownLatch(10);
for (int i=0;i<10;i++) {
new Thread(()->{
System.out.println("hello DW");
countDownLatch.countDown();
}).start();
}
countDownLatch.await();
System.out.println("dfghj");
}
2.
public static void main(String[] args) throws InterruptedException {
for (int i=0;i<10;i++) {
new Thread(()->{
System.out.println("hello DW");
}).start();
}
Thread.sleep(1000);
System.out.println("dfghj");
}
3. public static void main(String[] args) throws InterruptedException {
List<Thread> list=new ArrayList<>();
for (int i=0;i<10;i++) {
Thread child = new Thread(()->{
System.out.println("hello DW");
});
list.add(child);
child.start();
}
for (Thread thread:list) {
thread.join();
}
System.out.println("dfghj");
}
4. public static void main(String[] args) throws InterruptedException, BrokenBarrierException {
final CyclicBarrier cyclicBarrier=new CyclicBarrier(10);
for (int i=0;i<10;i++) {
Thread child = new Thread(()->{
System.out.println("hello DW");
try {
cyclicBarrier.await();
} catch (Exception e) {
e.printStackTrace();
}
});
child.start();
}
cyclicBarrier.await();
System.out.println("dfghj");
}
发表于 2019-03-24 17:15:23
回复(1)
0
一笑而过2222
1. 代码执行顺序分析 - 原始代码可能存在多个线程同时执行相关打印操作的情况(虽然未给出具体代码,但从问题可推测)。 - 在多线程环境下,如果没有正确的同步机制,线程的执行顺序是不确定的。例如,一个线程可能在打印“Hello, DWD”的过程中,另一个线程可能已经开始打印“Done All DWD”,这就无法保证所有“Hello, DWD”一定在“Done All DWD”之前输出。 2. 提供的方法解释 - CountDownLatch - CountDownLatch是一个同步辅助类,它允许一个或多个线程等待其他线程完成操作。 - 可以在主线程中创建一个CountDownLatch对象,并设置一个计数(比如等于需要打印“Hello, DWD”的线程数量)。 - 每个打印“Hello, DWD”的线程在完成打印后,调用CountDownLatch的countDown方法,将计数减1。 - 主线程在所有线程都完成打印“Hello, DWD”之前(即CountDownLatch的计数未减到0之前),一直等待。然后主线程再执行打印“Done All DWD”的操作,这样就可以保证所有“Hello, DWD”一定在“Done All DWD”之前输出。 - 线程池await - 如果使用线程池来管理线程,可以利用线程池的相关等待机制。 - 例如,在提交所有打印“Hello, DWD”的任务到线程池后,可以调用线程池的await方法(如果线程池支持类似功能),等待所有任务完成。 - 然后再执行打印“Done All DWD”的操作,从而保证顺序。 - 共享变量 - 可以使用一个共享变量来标记是否所有“Hello, DWD”都已经打印完成。 - 每个打印“Hello, DDWD”的线程在完成打印后,更新这个共享变量。 - 主线程不断检查这个共享变量,直到它表示所有“Hello, DWD”都已完成,然后再打印“Done All DWD”。
发表于 2024-11-02 17:03:22
回复(0)
0
无穷大啦啦啦
join
发表于 2019-01-17 19:50:50
回复(0)
这道题你会答吗?花几分钟告诉大家答案吧!
提交观点
问题信息
点我达
2019
Java工程师
上传者:
小小
难度:
3条回答
10收藏
928浏览
热门推荐
相关试题
(verbal)最近的研究显示,许...
言语理解与表达
2019
普华永道
人力资源
审计
税务服务
风险管理
管理咨询
行政管理
评论
(2)
来自
职能类模拟题14
(verbal)最近的研究显示,许...
言语理解与表达
2019
普华永道
人力资源
审计
税务服务
风险管理
管理咨询
行政管理
评论
(3)
来自
职能类模拟题14
在大语言模型中,什么是"Gated...
大模型开发
评论
(1)
关于大模型“上下文窗口”的理解,以...
大模型概念
评论
(1)
Vue Router的全局前置守卫...
Vue
评论
(1)
扫描二维码,关注牛客网
意见反馈
下载牛客APP,随时随地刷题