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

来源:互联网 发布:扁皮弹弓皮筋长度算法 编辑:程序博客网 时间:2024/06/05 01:08
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()(单个后台线程);
阅读全文
0 0
原创粉丝点击