Java多线程的简单实现以及耗时操作的效率对比

通过多线程实现耗时操作,如网络请求,可以显著提高运行效率。文章探讨了Java中多线程的简单实现,并对比了不同线程池方法的效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

public class ThreadDemo {

    public static void main(String[] args) {
        MyRunnable command = new MyRunnable();
        long start = System.currentTimeMillis();
        int executeCount = 10;
        command.setEndListener(new MyRunnable.EndListener() {
            private int count = 0;

            @Override
            public void end() {
                count++;
                if (count == executeCount) {
                    long end = System.currentTimeMillis();
                    System.out.println("全部请求执行完毕,耗时:" + (end - start) + "毫秒");
                }
            }
        });
        System.out.println("开始请求");

        singleThread(command,executeCount);
//        multiThread(command, executeCount, 100);
    }

    /**
     * 单线程运行
     *
     * @param runnable     run
     * @param executeCount 运行次数
     */
    public static void singleThread(MyRunnable runnable, int executeCount) {
        ExecutorService executorService = Executors.newSingleThreadExecutor();//单一后台线程
        for (int i = 0; i < executeCount; i++) {
            executorService.execute(runnable);
        }
    }

    /**
     * 多线程运行
     *
     * @param runnable        run
     * @param executeCount    运行次数
     * @param coreThreadCount 核心线程数量
     */
    public static void multiThread(MyRunnable runnable, int executeCount, int coreThreadCount) {
        BlockingQueue<Runnable> queue = new LinkedBlockingQueue<Runnable>();
        ThreadPoolExecutor threadPool = new ThreadPoolExecutor(coreThreadCount, 200, 2000, TimeUnit.SECONDS, queue);
        for (int i = 0; i < executeCount; i++) {
            threadPool.execute(runnable);
        }
    }

    public static class MyRunnable implements Runnable {
        private EndListener listener;
        private int count;

        @Override
        public void run() {
            try {
                int currentCount = 0;
                synchronized (MyRunnable.class) {
                    currentCount = count++;
                    System.out.println("线程:" + Thread.currentThread().getName() + "进行第" + currentCount + "次请求");
                }
                Thread.sleep(100);
                System.out.println("线程:" + Thread.currentThread().getName() + "第" + currentCount + "次请求完成");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            listener.end();
        }

        public void setEndListener(EndListener listener) {
            this.listener = listener;
        }

        interface EndListener {
            void end();
        }
    }
}

运行结果

singleThread(command,executeCount);
开始请求
线程:pool-1-thread-1进行第0次请求
线程:pool-1-thread-10次请求完成
线程:pool-1-thread-1进行第1次请求
线程:pool-1-thread-11次请求完成
线程:pool-1-thread-1进行第2次请求
线程:pool-1-thread-12次请求完成
线程:pool-1-thread-1进行第3次请求
线程:pool-1-thread-13次请求完成
线程:pool-1-thread-1进行第4次请求
线程:pool-1-thread-14次请求完成
线程:pool-1-thread-1进行第5次请求
线程:pool-1-thread-15次请求完成
线程:pool-1-thread-1进行第6次请求
线程:pool-1-thread-16次请求完成
线程:pool-1-thread-1进行第7次请求
线程:pool-1-thread-17次请求完成
线程:pool-1-thread-1进行第8次请求
线程:pool-1-thread-18次请求完成
线程:pool-1-thread-1进行第9次请求
线程:pool-1-thread-19次请求完成
全部请求执行完毕,耗时:1132毫秒

 multiThread(command, executeCount, 100);
开始请求
线程:pool-1-thread-1进行第0次请求
线程:pool-1-thread-2进行第1次请求
线程:pool-1-thread-3进行第2次请求
线程:pool-1-thread-4进行第3次请求
线程:pool-1-thread-5进行第4次请求
线程:pool-1-thread-6进行第5次请求
线程:pool-1-thread-7进行第6次请求
线程:pool-1-thread-8进行第7次请求
线程:pool-1-thread-9进行第8次请求
线程:pool-1-thread-10进行第9次请求
线程:pool-1-thread-10次请求完成
线程:pool-1-thread-21次请求完成
线程:pool-1-thread-32次请求完成
线程:pool-1-thread-54次请求完成
线程:pool-1-thread-65次请求完成
线程:pool-1-thread-43次请求完成
线程:pool-1-thread-76次请求完成
线程:pool-1-thread-109次请求完成
线程:pool-1-thread-98次请求完成
线程:pool-1-thread-87次请求完成
全部请求执行完毕,耗时:121毫秒

从以上运行的结果可知,当需要进行重复的耗时操作(比如网络请求),使用多线程能大大提高运行效率


附几个常用的线程池方法:

 Executors.newCachedThreadPool()(无界线程池,可以进行自动线程回收);
 Executors.newFixedThreadPool(int)(固定大小线程池);
 Executors.newSingleThreadExecutor()(单个后台线程);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值