使用线程池和单线程

/**
* 使用线程池和单线程
**/
public class TestTask {

    public static void main(String[] args) throws InterruptedException {
        long currentTimeMillis = System.currentTimeMillis();
        System.out.println("currentTimeMillis:" + currentTimeMillis);
        useThreadPool();
        System.out.println("cost:" + (System.currentTimeMillis() - currentTimeMillis));
        System.out.println("===================================================");
        currentTimeMillis = System.currentTimeMillis();
        useSinglePool();
        System.out.println("cost:" + (System.currentTimeMillis() - currentTimeMillis));

    }

    /**
     *
     */
    private static void useSinglePool() {
        for (int i = 0; i < 10; i++) {
            doTask(RandomStringUtils.randomAlphanumeric(10), RandomStringUtils.randomAlphanumeric(5));
        }
    }

    /**
     *
     */
    private static void useThreadPool() {
        ExecutorService es = Executors.newFixedThreadPool(10);
        List<Future<Boolean>> list = new ArrayList<Future<Boolean>>();
        for (int i = 0; i < 10; i++) {
            Future<Boolean> future = es.submit(new Callable<Boolean>() {

                @Override
                public Boolean call() {
                    return doTask(RandomStringUtils.randomAlphanumeric(10), RandomStringUtils.randomAlphanumeric(5));
                }
            });
            list.add(future);
        }     //关闭线程池,等旧任务执行完,并停止接收新任务
        es.shutdown();
        try {       //获取处理结果
            for (Future<Boolean> future : list) {
                System.out.println(future.get());
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
    }

    public static boolean doTask(String arg1, String arg2) {
        System.out.println(Thread.currentThread() + ":" + arg1 + "_" + arg2);
        try {
           //模拟业务处理时长
            Thread.sleep(1000);
            return true;
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return false;
        }
    }
}

  

currentTimeMillis:1481104024029
Thread[pool-1-thread-2,5,main]:yaJSUdkD4f_v3rqW
Thread[pool-1-thread-3,5,main]:PpQbrtr7wP_KE78z
Thread[pool-1-thread-10,5,main]:LSODdw5Zqk_4LxLY
Thread[pool-1-thread-7,5,main]:KDseIk6FJ9_84qra
Thread[pool-1-thread-6,5,main]:ucm8VSevwB_WVOhS
Thread[pool-1-thread-4,5,main]:c132FVrokB_gtQDt
Thread[pool-1-thread-9,5,main]:KKcWv3rmVc_GR9LZ
Thread[pool-1-thread-5,5,main]:clXJOjW6F4_TlEzf
Thread[pool-1-thread-8,5,main]:aQBLjR4BTG_KwqBG
Thread[pool-1-thread-1,5,main]:jtyxUhMTSa_ykpVu
true
true
true
true
true
true
true
true
true
true
cost:1163
===================================================
Thread[main,5,main]:ncJJsfIfDH_pu7mj
Thread[main,5,main]:cFTiqRR8SZ_kXgYz
Thread[main,5,main]:k27V4Xzs43_9x7iC
Thread[main,5,main]:Butab2DJHb_4ePjg
Thread[main,5,main]:qhGBE1iyBE_SHOGj
Thread[main,5,main]:DEhiau4dqG_fxNa0
Thread[main,5,main]:byTFoqVkBC_Lb7vm
Thread[main,5,main]:Q544NhN0Lr_rpbwS
Thread[main,5,main]:5nNdV1G1nQ_VkvAK
Thread[main,5,main]:N3j4o8INfl_eLruR
cost:10001
时间: 2024-10-12 21:15:47

使用线程池和单线程的相关文章

java笔记--使用线程池优化多线程编程

使用线程池优化多线程编程 认识线程池 在Java中,所有的对象都是需要通过new操作符来创建的,如果创建大量短生命周期的对象,将会使得整个程序的性能非常的低下.这种时候就需要用到了池的技术,比如数据库连接池,线程池等. 在java1.5之后,java自带了线程池,在util包下新增了concurrent包,这个包主要作用就是介绍java线程和线程池如何使用的. 在包java.util.concurrent下的 Executors类中定义了Executor.ExecutorService.Sche

Java Web应用中调优线程池的重要性

不论你是否关注,Java Web应用都或多或少的使用了线程池来处理请求.线程池的实现细节可能会被忽视,但是有关于线程池的使用和调优迟早是需要了解的.本文主要介绍Java线程池的使用和如何正确的配置线程池. 单线程 我们先从基础开始.无论使用哪种应用服务器或者框架(如Tomcat.Jetty等),他们都有类似的基础实现.Web服务的基础是套接字(socket),套接字负责监听端口,等待TCP连接,并接受TCP连接.一旦TCP连接被接受,即可从新创建的TCP连接中读取和发送数据. 为了能够理解上述流

Java多线程18:线程池

使用线程池与不使用线程池的差别 先来看一下使用线程池与不适应线程池的差别,第一段代码是使用线程池的: public static void main(String[] args) { long startTime = System.currentTimeMillis(); final List<Integer> l = new LinkedList<Integer>(); ThreadPoolExecutor tp = new ThreadPoolExecutor(100, 100

java 多线程 26 : 线程池

使用线程池与不使用线程池的差别 先来看一下使用线程池与不适应线程池的差别,第一段代码是使用线程池的: public static void main(String[] args) { long startTime = System.currentTimeMillis(); final List<Integer> l = new LinkedList<Integer>(); ThreadPoolExecutor tp = new ThreadPoolExecutor(100, 100

线程池(ThreadPoolExecutor JDK1.7)

平常我们经常都会使用到线程池,但是有没考虑过为什么需要使用线程池呢?下面我列举一下问题,大家可以思考一下 1.当前服务器的硬件环境是多少核的CPU,它和线程的关系又是什么? 2.jvm能创建多少个线程? 3.多线程主要解决什么问题? 4.你使用线程池的目的是什么? 以上几个问题都是帮助你更好的使用java的线程(还可以衍生更多的小问题,如:jvm维护线程的消耗,cpu调度线程的消耗,应该使用多少个线程才能最大化利用多核CPU..).答案需要自己去百度,我这也讲不好,反而误导大家. 线程池顾名思义

转:Java Web应用中调优线程池的重要性

不论你是否关注,Java Web应用都或多或少的使用了线程池来处理请求.线程池的实现细节可能会被忽视,但是有关于线程池的使用和调优迟早是需要了解的.本文主要介绍Java线程池的使用和如何正确的配置线程池. 单线程 我们先从基础开始.无论使用哪种应用服务器或者框架(如Tomcat.Jetty等),他们都有类似的基础实现.Web服务的基础是套接字 (socket),套接字负责监听端口,等待TCP连接,并接受TCP连接.一旦TCP连接被接受,即可从新创建的TCP连接中读取和发送数据. 为了能够理解上述

Java源码解析 - ThreadPoolExecutor 线程池

1 线程池的好处 线程使应用能够更加充分合理地协调利用CPU.内存.网络.I/O等系统资源.线程的创建需要开辟虚拟机栈.本地方法栈.程序计数器等线程私有的内存空间;在线程销毁时需要回收这些系统资源.频繁地创建和销毁线程会浪费大量的系统资源,增加并发编程风险. 在服务器负载过大的时候,如何让新的线程等待或者友好地拒绝服务? 这些都是线程自身无法解决的;所以需要通过线程池协调多个线程,并实现类似主次线程隔离.定时执行.周期执行等任务. 线程池的作用包括:●利用线程池管理并复用线程.控制最大并发数等●

Java中常用的四种线程池

在Java中使用线程池,可以用ThreadPoolExecutor的构造函数直接创建出线程池实例,如何使用参见之前的文章Java线程池构造参数详解.不过,在Executors类中,为我们提供了常用线程池的创建方法.接下来我们就来了解常用的四种: newFixedThreadPool 首先,看一下这种线程池的创建方法: public static ExecutorService newFixedThreadPool(int nThreads) { return new ThreadPoolExec

简谈Java中常用的四种线程池

newFixedThreadPool 首先,看一下这种线程池的创建方法: public static ExecutorService newFixedThreadPool(int nThreads) { return new ThreadPoolExecutor(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>()); } 从构造方法可以看出,它创建了一个固定大小的线程池,每次提交一