【发布时间】:2020-07-27 19:34:50
【问题描述】:
我的任务是创建 x 个线程,并以某种方式使用 MethodA 和 B,并同步它们,最后捕获一些异常。 我知道这不是一个很好的任务描述,但这就是我得到任务的方式。
所以问题是,这段代码能做什么,任务要求什么? 这些线程是否正确同步?
public class Test2{
public static synchronized void doActionA(){
System.out.println("Hi");
}
public static synchronized void doActionB(){
System.out.println("Hello");
}
public static void main(String[] args) {
for(int i = 0; i < 10000; ++i){
try{
new Thread(() -> {
doActionA();
doActionB();
}).start();
}catch(Exception e){
e.printStackTrace();
}finally{
System.out.println(":)");
}
}
}
}
【问题讨论】:
-
我不太确定任务要求什么,但我可以说你的两个方法中的
synchronized关键字完全没有做任何事情,因为System.out.println()本身就是一个同步方法。 -
你想创建 10k 个线程吗?我不推荐它。通过 Executors 或 smth 使用 threadPool。第二件事是您的异常捕获没有用,因为它们无法在另一个线程中捕获异常。
-
@CharlieArmstrong:让我们假设,无论方法内部没有同步,那么这些线程会同步吗?两天后我要写一个编程考试,他们想看看我们是否理解这些概念,这个任务可能是考试中的这种,或者有点不同。
-
@cool:我可能只需要 100 个线程,但为了在控制台中打印,我做了 10k。执行者也将成为考试的一部分,所以我也可以这样尝试。
-
“同步它们”到底是什么意思?这将确保一次最多有一个线程正在执行
doActionA或B,但不能保证它们不会被穿插(例如,它可能会打印Hi Hello Hi Hello或Hi Hi Hello Hello等)。
标签: java multithreading synchronized