Java之執行緒2--Executor
阿新 • • 發佈:2018-12-10
為什麼要引入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!)