【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
THE END
二维码
【Java 笔试题】创建十个线程,每个线程随机睡眠1–10秒,最终主线程统计十个线程共计休眠时间,打印输出,程序结束。
这是在我近几天参加的笔试过程中遇到的一道Java多线……
<<上一篇
下一篇>>
文章目录
关闭
目 录