一、线程的问题

一般来说 如果直接使用 Thread类去创建一个线程如下:

new Thread(){
		@Override
		pubic void run(){
		
		}
	}.start();
  1. 首先频繁的创建和销毁对象本省就是一个很消耗内存资源的事情;
  2. 如果用户量较大,导致占用过多的资源,可能会导致我们的服务器由于资源不足而产生宕机的问题;
  3. 所以说在实际开发中 不会去使用 new Thread()的方式去创建一个线程;

二、使用线程池的优点

  1. 线程池中线程的使用率提升,减少对象的创建、销毁;
  2. 线程池可以控制线程池数,有效的提升服务器的使用支援,避免由于资源不足而发生宕机等问题;



三、四种线程池的使用方式



Executors 提供了四种线程池:

newCachedThreadPool
创建一个线程池,如果线程池中的线程数量过大,它可以有效的回收多余的线程,如果线程数不足,那么它可以创建新的线程。

newFixedThreadPool
这种方式可以指定线程池中的线程数,线程不足时则需要等待其他线程释放。

newScheduledThreadPool
该线程池支持定时,以及周期性的任务执行,我们可以延迟任务的执行时间,也可以设置一个周期性的时间让任务重复执行。

newSingleThreadExecutor
创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。

将线程放入线程池得两种方法:

1- ExecutorService 类中的 submit(Runnable task) submit(Callable task)
2- Executor 接口中的execute(Runnable command)

下面是 通过 Executors.newCachedThreadPool(); 创建一个线程池

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,
 * 若无可回收,则新建线程。线程池的规模不存在限制。
 */
public class NewCachedThreadPool {
    public static void main(String[] args) {
        ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
        for (int i = 0; i < 10; i++) {
            final int index = i;
            try {
                Thread.sleep(index * 1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            //1- 在未来某个时间执行给定的命令。
            // 该命令可能在新的线程、已入池的线程或者正调用的线程中执行,这由 Executor 实现决定。
//            cachedThreadPool.execute(new Runnable() {
//                @Override
//                public void run() {
//                    System.out.println(index);
//                }
//            });

            //2- 提交一个 Runnable 任务用于执行,并返回一个表示该任务的 Future。
            // 该 Future 的 get 方法在成功完成时将会返回给定的结果
            cachedThreadPool.submit(new Runnable() {
                @Override
                public void run() {
                    System.out.println(index);
                }
            });
        }
        cachedThreadPool.shutdown();
    }
}

其他的 线程池的插件方法均由 Executors来创建…不做案例