线程池

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线程池相关的知识,希望对你有一定的参考价值。

1、为什么要创建线程池?

    1)   java中一个请求创建一个线程,他的创建和销毁开销是很大的,如果在jvm中创建太多线程会过度消耗内存导致内存不足。

    2)   活动的线程是消耗资源的,如果线程的数量得不到限制,那么当服务端与很多客户端通信,会创建大量的线程,导致内存空间不足,影响使用。

2、Executor

    帮助开发人员有效地进行线程控制。

    1)  newFixedThreadPool()方法,该方法返回一个固定数量的线程池。当有个一任务提交时,若线程池中空闲则立刻执行,若没有,会被暂缓在一个任务队列中等待有空闲的线程去执行。

    2)  newSingleThreadExecutor()方法,创建一个线程的线程池,若空闲执行,若没有,暂缓到任务队列中等待执行。

    3)  newCachedThreadPool()方法,返回一个可根据实际情况吊证线程个数的线程池,不限制最大线程数量,若有空闲线程,执行,没有创建。并且每个空闲线程会在60秒钟自动回收。

   4)  newScheduledThreadPool()方法,该方法返回一个ScheduledExecutorService对象,但该线程池可以指定线程池的数量。

   5)  自定义线程池:

 public static void main(String[] args) {
        ThreadPoolExecutor executor = new
                ThreadPoolExecutor(1,2,60,
                TimeUnit.SECONDS,new ArrayBlockingQueue<Runnable>(3),
                new ThreadPoolExecutor.DiscardOldestPolicy());
        Task task1 = new Task("一号窗口:");
        Task task2 = new Task("二号窗口:");
        Task task3 = new Task("三号窗口:");
        Task task4 = new Task("四号窗口:");
        Task task5 = new Task("五号窗口:");
        Task task6 = new Task("六号窗口:");
        executor.execute(task1);
        executor.execute(task2);
        executor.execute(task3);
        executor.execute(task4);
        executor.execute(task5);
        executor.execute(task6);
    }

一、继承Thread类和实现Runnable接口创建线程的区别?

java支持单继承多实现,在实现runnable接口用Thread构造方法创建线程时,可以共享一个runnable对象,可实现资源共享。

而Thread不行,需要去定义静态变量。一个是多线程分别去完成自己的任务,一个是多个线程共同完成一个任务。

 

以上是关于线程池的主要内容,如果未能解决你的问题,请参考以下文章

Java——线程池

Motan在服务provider端用于处理request的线程池

Java线程池详解

Java线程池详解

Java 线程池详解

线程池-实现一个取消选项