(執行緒四)執行緒池
執行緒池:顧名思義,充滿執行緒的池子,通過呼叫Executors類方法來實現建立執行緒池以及進行任務的任務。
例一:通過Executors類靜態方法ExecutorService newFixedThreadPool(int nThread)(混合執行緒)來建立執行緒池。再呼叫execute方法將任務新增至執行緒池後便可以執行。
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ThreadpoolDemo1 {
public static void main(String[] args) {
ExecutorService pool=Executors.newFixedThreadPool(2);
Run r1=new Run("r1");
Run r2=new Run("r2");
Run r3=new Run("r3");
Run r4=new Run("r4");
pool.execute(r1);
pool.execute(r2);
pool.execute(r3);
pool.execute(r4);
}
}
class Run implements Runnable{
private String name;
public Run(String name) {
this.name=name;
}
public void run() {
for(int i=0;i<3;i++) {
System.out.println(name+":"+i);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
執行結果:
r1:0
r2:0
r1:1
r2:1
r2:2
r1:2
r3:0
r4:0
r3:1
r4:1
r4:2
r3:2
有結果可知,該方法開始任務的順序為新增任務順序,nThread引數為可同時開始的執行緒數,但是任務結束後為什麼程式仍在執行?因為我們指定的可開始的執行緒有兩個,但是其中執行緒池中一共有多少個執行緒我們並不知道,所以可能還會有其他執行緒在進行,所以程式並沒有結束
例二:通過Executors類靜態方法ExecutorService newSingleThreadExecutor()(單個執行緒)來建立執行緒池。再呼叫execute方法將任務新增至執行緒池後便可以執行。
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ThreadpoolDemo2 {
public static void main(String[] args) {
ExecutorService pool= Executors.newSingleThreadExecutor();
Run r1=new Run("A");
Run r2=new Run("B");
Run r3=new Run("C");
pool.execute(r1);
pool.execute(r2);
pool.execute(r3);
}
}
class Run implements Runnable{
private String name;
public Run(String name) {
this.name=name;
}
public void run() {
for(int i=0;i<3;i++) {
System.out.println(name+":"+i);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
執行結果:
A:0
A:1
A:2
B:0
B:1
B:2
C:0
C:1
C:2
例三:通過Executors類靜態方法ExecutorService newCachedThreadPool()(快取執行緒)來建立執行緒池。再呼叫execute方法將任務新增至執行緒池後便可以執行。
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ThreadpoolDemo3 {
public static void main(String[] args) {
ExecutorService pool=Executors.newCachedThreadPool();
Run r1=new Run("r1");
Run r2=new Run("r2");
pool.execute(r1);
pool.execute(r2);
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Run r3=new Run("r3");
Run r4=new Run("r4");
Run r5=new Run("r5");
pool.execute(r3);
pool.execute(r4);
pool.execute(r5);
}
}
class Run implements Runnable{
private String name;
public Run(String name) {
this.name=name;
}
public void run() {
for(int i=0;i<3;i++) {
System.out.println(name+":"+i);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
執行結果:
r2:0
r1:0
r1:1
r2:1
r2:2
r1:2
r4:0
r3:0
r5:0
r3:1
r4:1
r5:1
r3:2
r4:2
r5:2
可見在該方法中會根據先開始幾個任務來確定給幾個執行緒,給定執行緒後再執行接下來的任務,當開始的任務執行結束後,執行緒會處於空閒狀態,當再次執行接下來的任務時,會同時開始確定數的任務,直至執行結束
例四:通過Executors類靜態方法ScheduledExecutorService newScheduledThreadPool(int corePoolSize)(定時執行)來建立執行緒池。再呼叫execute方法將任務新增至執行緒池後便可以執行,該類還有一個方法為scheduled(Runnable command,long delay,TimeUnit unit),引數內容為什麼任務,多長時間後執行,什麼單位。
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class ThreadpoolDemo4 {
public static void main(String[] args) {
ScheduledExecutorService pool=Executors.newScheduledThreadPool(2);
Run r1=new Run("A");
Run r2=new Run("B");
Run r3=new Run("C");
Run r4=new Run("D");
pool.schedule(r1,3,TimeUnit.SECONDS);
pool.execute(r2);
pool.execute(r3);
pool.schedule(r4,6,TimeUnit.SECONDS);
}
}
class Run implements Runnable{
private String name;
public Run(String name) {
this.name=name;
}
public void run() {
for(int i=0;i<3;i++) {
System.out.println(name+":"+i);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
執行結果:
B:0
C:0
B:1
C:1
B:2
C:2
A:0
A:1
A:2
D:0
D:1
D:2