【Java 笔试题】创建十个线程,每个线程随机睡眠1–10秒,最终主线程统计十个线程共计休眠时间,打印输出,程序结束。
这是在我近几天参加的笔试过程中遇到的一道Java多线程相关的笔试题,不过正好在前几天,我有重新去复习Java并发编程相关的知识,而且这道题目并不是太难,就是考察基础的JUC编程基本功。在这里记录一下,总之无论是笔试或者面试,JUC编程都是重中之重。
题目
具体记不太清了,大概意思就是如题所说:让你创建十个线程,然后在每个线程中随机睡眠1--10秒,最终由主线程统计十个线程共计休眠时间,打印输出,程序结束。
题解
首先,我认为应该有很多种实现方案,但是,我有尝试几种,并没正确实现,主要是我太菜。。。下面就记录下我写出来的解决方法。
因为题意好像并没有说清楚,是让十个线程同时启动执行,还是同步执行最后由主线程统计结果。所以首先我写出的是让十个线程同步去执行后再去统计结果的代码。
public class Test{
public static void main(String[] args){
Integer integer = 0;
for (int i = 0; i < 10; i++) {
FutureTask<Integer> futureTask = new FutureTask<>(new MyThread());
new Thread(futureTask).start();
try {
integer += futureTask.get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
System.out.println(integer);
}
}
class MyThread implements Callable<Integer>{
@Override
public Integer call() throws Exception {
int randomTime = (int) ((Math.random() * 10) + 1);
System.out.println(Thread.currentThread().getName() + "线程随机休眠:" + randomTime + "秒");
TimeUnit.SECONDS.sleep(randomTime);
return randomTime;
}
}
打印结果:
Thread-0线程随机休眠:3秒
Thread-1线程随机休眠:1秒
Thread-2线程随机休眠:5秒
Thread-3线程随机休眠:4秒
Thread-4线程随机休眠:7秒
Thread-5线程随机休眠:6秒
Thread-6线程随机休眠:7秒
Thread-7线程随机休眠:2秒
Thread-8线程随机休眠:9秒
Thread-9线程随机休眠:2秒
46
Process finished with exit code 0
当然以上代码可以使用线程池实现,代码如下:
public class ThreadPoolTest {
public static void main(String[] args) {
Integer integer = 0;
ExecutorService executorService = Executors.newFixedThreadPool(10);
MyThread1 myThread1 = new MyThread1();
for (int i = 0; i < 10; i++) {
Future<Integer> submit = executorService.submit(myThread1);
try {
integer += submit.get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
System.out.println(integer);
executorService.shutdown();
}
}
class MyThread1 implements Callable<Integer> {
@Override
public Integer call() throws Exception {
int randomTime = (int) ((Math.random() * 10) + 1);
System.out.println(Thread.currentThread().getName() + "线程随机休眠:" + randomTime + "秒");
TimeUnit.SECONDS.sleep(randomTime);
return randomTime;
}
}
结果与上面一样,都是等待几十秒后,全部线程执行结束,打印结果程序结束。在以上线程池的基础上,可以改进一下,让十个线程同时启动执行,很快就可以打印统计结果。
public class Test2 {
public static void main(String[] args) {
Integer sum = 0;
ExecutorService executorService = Executors.newFixedThreadPool(10);
Future<Integer>[] futures = new Future[10];
for (int i = 0; i < 10; i++) {
futures[i] = executorService.submit(new MyThread3());
}
try {
for (int i = 0; i < 10; i++) {
sum += futures[i].get();
}
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
System.out.println(sum);
executorService.shutdown();
}
}
class MyThread3 implements Callable<Integer>{
@Override
public Integer call() throws Exception {
int randomTime = (int) ((Math.random() * 10) + 1);
System.out.println(Thread.currentThread().getName() + "线程随机休眠:" + randomTime + "秒");
TimeUnit.SECONDS.sleep(randomTime);
return randomTime;
}
}
代码执行结果与上面类似,但是效果不同,会在刚启动时就直接打印:
pool-1-thread-4线程随机休眠:4秒
pool-1-thread-3线程随机休眠:7秒
pool-1-thread-2线程随机休眠:8秒
pool-1-thread-5线程随机休眠:4秒
pool-1-thread-1线程随机休眠:6秒
pool-1-thread-7线程随机休眠:5秒
pool-1-thread-6线程随机休眠:8秒
pool-1-thread-8线程随机休眠:1秒
pool-1-thread-9线程随机休眠:3秒
pool-1-thread-10线程随机休眠:3秒
在等待8秒后,打印统计结果,程序结束。
总结
其实,不难发现,虽说有解决了问题,仿佛是两种方法,其实本质就是一种,使用Callable
来完成的。我想还可以使用线程通信?共享变量?ThreadLocal?CyclicBarrier?......
后续补充......求大佬赐教。
微信关注
编程那点事儿
本站为非盈利性站点,所有资源、文章等仅供学习参考,并不贩卖软件且不存在任何商业目的及用途,如果您访问和下载某文件,表示您同意只将此文件用于参考、学习而非其他用途。
本站所发布的一切软件资源、文章内容、页面内容可能整理来自于互联网,在此郑重声明本站仅限用于学习和研究目的;并告知用户不得将上述内容用于商业或者非法用途,否则一切后果请用户自负。
如果本站相关内容有侵犯到您的合法权益,请仔细阅读本站公布的投诉指引页相关内容联系我,依法依规进行处理!
作者:理想
链接:https://www.imyjs.cn/archives/1143
本站所发布的一切软件资源、文章内容、页面内容可能整理来自于互联网,在此郑重声明本站仅限用于学习和研究目的;并告知用户不得将上述内容用于商业或者非法用途,否则一切后果请用户自负。
如果本站相关内容有侵犯到您的合法权益,请仔细阅读本站公布的投诉指引页相关内容联系我,依法依规进行处理!
作者:理想
链接:https://www.imyjs.cn/archives/1143
THE END
3
二维码


【Java 笔试题】创建十个线程,每个线程随机睡眠1–10秒,最终主线程统计十个线程共计休眠时间,打印输出,程序结束。
这是在我近几天参加的笔试过程中遇到的一道Java多线……

文章目录
关闭

理想
理想