-java程序在创建和启动一个新的线程时需要的成本比较高,它涉及到了

和操作系统进行交互。

-使用线程池可以很高程度提高性能。尤其是当程序中需要大量使用生命周期比较

短的线程时,更应该考虑使用线程池。

-线程池中的每一个线程使用结束后,不会死亡,而是会再次回到线程池中,

成为空闲状态,等待下一个对象来使用。

-在早期版本中,需要手动实现线程池。现在java已经内置线程池了。

在jdk中添加了一个工厂类  Executors  我们使用工程类可以获取线程池。

static ExecutorService newCachedThreadPool()

创建一个根据需要创建新线程的线程池,但在可用时将重新使用以前构造的线程。

static ExecutorService newFixedThreadPool(int nThreads)

创建一个线程池,该线程池重用固定数量的从共享无界队列中运行的线程。

2,返回值是  ExecutorService  这个对象就表示一个线程池。

可以用来执行 Runnable对象或者Callable对象所表示的线程。

3,线程池中用来执行线程任务的方法

<T> Future<T> submit(Callable<T> task)

提交值返回任务以执行,并返回代表任务待处理结果的Future。

Future<?> submit(Runnable task)

提交一个可运行的任务执行,并返回一个表示该任务的未来。

<T> Future<T> submit(Runnable task, T result)

提交一个可运行的任务执行,并返回一个表示该任务的未来。

4,案例

package com.momo.thread;

public class MyRunnable  implements Runnable{

@Override

public void run() {

for (int i = 0; i < 100; i++) {

System.out.println(Thread.currentThread().getName()+":"+i);

}

}

}

package com.momo.demo;

import com.momo.thread.MyRunnable;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

import java.util.concurrent.Future;

public class Demo1 {

public static void main(String[] args) {

//创建线程池对象

// ExecutorService es = Executors.newCachedThreadPool();

ExecutorService es = Executors.newFixedThreadPool(10);

//调用方法执行任务

MyRunnable m = new MyRunnable();

es.submit(m);

es.submit(m);

es.submit(m);

es.submit(m);

//关闭

es.shutdown();

}

}