1. 程式人生 > >Java之執行緒2--Executor

Java之執行緒2--Executor

為什麼要引入Executor:

1)按照傳統的方式,每次new Thread建立就一個物件,物件的建立和銷燬是耗費資源的;

2)每次new Thread建立的執行緒缺乏管理,執行緒之間相互競爭,佔用過多的資源,嚴重的還會導致癱瘓;

3)不利於擴充套件,比如定時執行、定期執行、執行緒中斷。

Executor的作用:為你管理Thread物件,從而簡化併發程式設計

1)Executor允許你管理非同步任務的執行而無需顯式地管理執行緒的生命週期;

2)能夠實現對現存執行緒重用,減少物件建立和銷燬耗費的資源;

3)有利於擴充套件,比如實現定時執行、定期執行、執行緒中斷。

4)控制最大併發執行緒數,避免過多資源相互競爭

先建立一個繼承Runnable的類

class LiftOff implements Runnable{
	protected int countDown = 10;
	private static int taskCount = 0;  //例項化物件計數
	private final int id = taskCount++; 
	public LiftOff() {};
	public  LiftOff(int countDown) {
		this.countDown = countDown;
	}
	
	public String status() {
		return "#"+id+"("+(countDown>0?countDown:"LiftOff!")+")";
	}
	@Override
	public void run() {
		while(countDown-->0) {
			System.out.println(status());
			Thread.yield();
		}
		
	}
}	

在MainThread中使用Executor()

1.使用CachedThreadPool

public class MainThread{
	public static void main(String[] args) {
		ExecutorService exec = Executors.newCachedThreadPool();
		for(int i=0 ; i<5 ; i++) {
			exec.execute(new LiftOff());
		}
		exec.shutdown();
	}
}

2.使用FixedThreadPool--可以控制執行緒的數量

public class MainThread{
	public static void main(String[] args) {
		ExecutorService exec = Executors.newFixedThreadPool(5);
		for(int i=0 ; i<5 ; i++) {
			exec.execute(new LiftOff());
		}
		exec.shutdown();
	}

}

3.使用SingleThreadExecutor--單執行緒的執行緒池,可以序列化地執行提交的多個任務

public class MainThread{
	public static void main(String[] args) {
		ExecutorService exec = Executors.newSingleThreadExecutor();
		for(int i=0 ; i<5 ; i++) {
			exec.execute(new LiftOff());
		}
		exec.shutdown();
	}

}

使用SingleThreadExecutor的執行結果

#0(9)
#0(8)
#0(7)
#0(6)
#0(5)
#0(4)
#0(3)
#0(2)
#0(1)
#0(LiftOff!)
#1(9)
#1(8)
#1(7)
#1(6)
#1(5)
#1(4)
#1(3)
#1(2)
#1(1)
#1(LiftOff!)
#2(9)
#2(8)
#2(7)
#2(6)
#2(5)
#2(4)
#2(3)
#2(2)
#2(1)
#2(LiftOff!)
#3(9)
#3(8)
#3(7)
#3(6)
#3(5)
#3(4)
#3(3)
#3(2)
#3(1)
#3(LiftOff!)
#4(9)
#4(8)
#4(7)
#4(6)
#4(5)
#4(4)
#4(3)
#4(2)
#4(1)
#4(LiftOff!)