【多线程】线程池

线程池

就是个装Thread对象的容器,线程的建立和销毁都是很耗费系统资源的事情,若是一个程序运行的代码很简单,可是涉及到屡次线程建立和销毁,将会很浪费时间,浪费资源,因此线程池站了出来解决这个问题,线程池里装了若干线程对象(建立线程池时要咱们指定),当一个用户须要执行线程任务时,从线程池拿一个对象分配任务,若是线程不够用,任务对象会等待,当一个线程任务结束,并不会销毁线程而是回答池子里去,线程的建立和管理交给jvm,咱们须要作的事情就是指定咱们须要几个线程,以及指定任务便可。java

使用

  1. 找util包的Executor对象要执行任务服务的对象

ExecutorService es = Executors.newFixedThreadPool(3);web

2.指定任务,能够定义Runnable接口实现类,能够匿名内部类,能够lambda表达式,总之将任务穿给第一步获取到的提供代码执行服务的对象,调用的方法是submitjvm

//匿名内部类
es.submit(new Runnable(){
	...
});
//lambda
es.submit(()->{...});

demo

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

public class ThreadPoolDemo {
	public static void main(String[] args) {
		// 1.获取执行任务的服务对象
		ExecutorService es = Executors.newFixedThreadPool(3);
		// 2.提交任务
		es.submit(() -> {
			for (int i = 0; i < 100; i++) {
				System.out.println(Thread.currentThread().getName() + "is hehe" + i);
			}
		});
		for (int i = 0; i < 100; i++) {
			System.out.println(Thread.currentThread().getName() + " is haha..." + i);
		}
		es.submit(() -> {
			for (int i = 0; i < 100; i++) {
				System.out.println(Thread.currentThread().getName() + "is hehe" + i);
			}
		});
		for (int i = 0; i < 100; i++) {
			System.out.println(Thread.currentThread().getName() + " is haha..." + i);
		}

		es.submit(() -> {
			for (int i = 0; i < 100; i++) {
				System.out.println(Thread.currentThread().getName() + "is hehe" + i);
			}
		});
		for (int i = 0; i < 100; i++) {
			System.out.println(Thread.currentThread().getName() + " is haha..." + i);
		}

	}
}