首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

Java5 多线程(2)-线程池

2013-03-21 
Java5 多线程(二)--线程池1,Java5线程池 线程池的概念与Executors类的应用首先介绍在TCP服务器编程模型的

Java5 多线程(二)--线程池

1,Java5线程池

 线程池的概念与Executors类的应用首先介绍在TCP服务器编程模型的原理,当一个客户端连接到服务器,服务器要起一个线程为之服,当客户端的回话结束时,线程也就结束了,即每一个客户端连接,服务器 就要为之创建一个新的线程,这好比假设每个报名学员都要通过我来亲自接 待,以便给每个学员一种好的感觉,但每个学员报名手续花费半个小时,对于 50名学生,我一个个接待和为之办手续,显然是不实际的,那么我会怎么做呢?我会先接待每个学员,打完招呼后,再把他分配给一名工作人员去办理手续 ,这样我就接待了每一名学员.         如果访问服务器的客户端很多,那么服务器要不断的创建和销毁线程, 这样将严重影响服务器的性能,如果真的来一名学员,我们就安排一名新的 工作人员为之服务,这也是不可能的,那么公司岂不是要招很多工作人员.应该是一名工作人员服务完一名学员,空闲下来后,一旦有新的学员要服务,我们安排该工作人员,为之服务.        线程池的概念于此类似,首先创建一些线程,他们的集合称为线程池,当服务器接收到一个客户请求后,就从线程池中取出一个空闲的线程为之服务,服务完成后不关闭该线程,而是将该线程还回到线程池中.        在线程池的编程模式下,任务是交给整个线程池,而不是直接交给某个线程,线程池拿到任务偶,他就在内部找有空闲的线程,再把任务交给内部某个空闲的线程,这就是封装.记住,任务是交给整个线程池,但可以同时向一个线程池中提交多个任务.创建固定大小的线程池:ExecutorService threadPool = Executors.newFixedThreadPool(3);threadPool.execute(Runnable runnable); 创建缓存的线程池:如果线程不够自动创建新的线程满足服务ExecutorService threadPool = Executors.newCachedThreadPool();threadPool.execute(Runnable runnable); 创建单一线程池.线程里面只有一个线程,如果该线程意外死亡,那么系统会自动创建一个新的线程来代替.ExecutorService threadPool = Executors.newSingleThreadExecutor();threadPool.execute(Runnable runnable); //执行完任务后关闭线程池,threadPool.shutdown();//不管任务是否完成都关闭线程池threadPool.shutdownNow(); 用线程池启动定时器.Executors.newScheduledThreadPool(3).schedule(new Runnable(){@Overridepublicvoid run() {}}, 20, TimeUnit.SECONDS);


2,Callable和Future的用法 通过这两个类可以得到线程执行后返回的结果.        ExecutorService executorService = Executors.newSingleThreadExecutor();        //通过submit方法提交任务        Future<String> future = executorService.submit(new Callable<String>() {            @Override            public String call() throws Exception {                return "hello world";            }        });         System.out.println("等待返回的结果");        try {            System.out.println("返回的结果,"+future.get());        } catch (Exception e) {            e.printStackTrace();        }Future取得的结果类型和Callable返回的结果类型必须一致,这是通过泛型来实现的.submit()方法返回的Future对象可以取消任务. CompletionService用于提交一组Callable任务,其take()方法返回已完成的一个Callable任务对应的Future对象ExecutorService executorService2 = Executors.newFixedThreadPool(3);        CompletionService<Integer> service = new ExecutorCompletionService<Integer>(                executorService2);        for (int i = 0; i < 10; i++) {            final int k = i;                service.submit(new Callable<Integer>() {                @Override                public Integer call() throws Exception {                    Thread.sleep(new Random().nextInt(5000));                    return k;                }            });        }         try {            for(int i = 0; i < 10; i++){                System.out.println(service.take().get());            }        } catch (Exception e) {            e.printStackTrace();        }
转载请注明出处: http://blog.csdn.net/johnny901114/article/details/8695693


热点排行