网络通信中的线程池

通常线程是:有一个请求然后会创建对应的线程;执行完之后再回收。等待下次请求。

这样不断的创建线程再销毁线程是一种资源浪费,而且也不能无限制的创建线程。所以我们要学会复用线程(线程池)。

 

 

Java提供的线程池: ExecutorService  通过实现这个接口可以达到线程池的管理。

网络通信中的线程池

 

runnable  void 无返回结果; callable 有具体类型返回结果。

通过创建上面两个对象 提交到线程池。然后会返回一个future对象。通过调用这个对象的isDone 可以查询是否执行结束。如果执行结束可以通过get()获取结果。

 

网络通信中的线程池

 

 

Executor 这个类里面提供了很多静态的方法提供了创建不同的线程池。

1创建一个线程达到复用。   2创建一个线程池可以设置里面有几个线程 例如电脑是4核CPU就创建4条线程来达到并行处理的能力。 

3 跟第二个不一样的就是当有新任务进来的时候,线程池满了会创建新线程。(更灵活)

4 有定时任务的线程池。

测试代码:

网络通信中的线程池
public class TestThreadPool {
    public static void main(String[] args) throws InterruptedException, ExecutionException {
        ExecutorService executorService = Executors.newFixedThreadPool(5);
        Callable<Integer> callable = new Callable<Integer>() {
            public Integer call() {
                int sum = 0;
                for (int i = 0; i < 100; i++)
                    sum += i;
                return sum;
            } };
        Runnable runnable = new Runnable() {
            public void run() {
                int sum = 0;
                for (int i = 0; i < 100; i++)
                    sum += i;

            }
        };

        Future<Integer> future = executorService.submit(callable);
        Future future1 = executorService.submit(runnable);

        boolean done = future.isDone();
        boolean done1 = future1.isDone();
        System.out.println("查看是否完成任务"+done);

        if(!done || !done1) TimeUnit.SECONDS.sleep(5);
        done = future.isDone(); done1 = future1.isDone();
        System.out.println(done+"------"+done1);
        System.out.println(future.get());
        System.out.println(future1.get());


        executorService.shutdown();
View Code

 

上一篇:如何在django视图中使用asyncio(协程)和ThreadPoolExecutor(多线程)


下一篇:JavaSE 之 传统日期格式化的线程问题