通常线程是:有一个请求然后会创建对应的线程;执行完之后再回收。等待下次请求。
这样不断的创建线程再销毁线程是一种资源浪费,而且也不能无限制的创建线程。所以我们要学会复用线程(线程池)。
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