【多線程】線程池

線程池

就是個裝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);
		}

	}
}