對於執行緒池的一些學習
ThreadPoolExecutor
執行緒池是什麼,作用:執行緒池可以解決兩個不同問題:由於減少了每個任務呼叫的開銷,它們通常可以在執行大量非同步任務時提供增強的效能,並且還可以提供繫結和管理資源(包括執行任務集時使用的執行緒)的方法。每個 ThreadPoolExecutor 還維護著一些基本的統計資料,如完成的任務數。
Thread與Runable的用法
class MyThread extends Thread {
String name; int ticket=5; public MyThread(String name) { this.name = name; } @Override public void run() { for (int i = 0; i < 5; i++) { if(ticket>0){ System.out.println("當前執行緒=" +Thread.currentThread().getName()+ "剩餘票數=" + ticket--); } } }
}
class MyRunnable implements Runnable {
int ticket=5;
public void run() {
for (int i = 0; i < 5; i++) {
if(ticket>0){
System.out.println("當前執行緒=" +Thread.currentThread().getName()+ "剩餘票數=" + ticket--);
}
}
}
}
public class MMMM {
public static void main(String[] args) { Thread thread1=new MyThread("a"); Thread thread2=new MyThread("b"); /*MyRunnable r=new MyRunnable(); Thread thread1=new Thread(r,"a"); Thread thread2=new Thread(r,"b");*/ thread1.start(); thread2.start(); } /** * 總結:呼叫Thread的run方法,只會執行一個執行緒,呼叫start方法可以建立一個執行緒去執行run方法 * * 資源無法共享,執行緒資源獨立 * * 拖過Runnable來實現資源共享,new一個Runnable類例項,通過Thread的strat方法執行Runnable的run方法 * * Thread的start啟動一個執行緒,進入等待佇列,run執行執行緒, * * Runnable方法的run不建立執行緒 * * */ </php>
四大執行緒池
1.可快取執行緒池 執行緒數無限制,有空閒執行緒複用,若無開啟新執行緒,一定程式上減少建立,銷燬執行緒,減少系統開銷
ExecutorService cachedThreadPool= Executors.newCachedThreadPool();
2.定長執行緒池(併發執行緒池) 可控制執行緒最大併發數,超出執行緒會在佇列中等待
ExecutorService fixedThreadPool=Executors.newFixedThreadPool(3);
3.定長執行緒池(週期性執行緒池) 定時週期性執行任務
ExecutorService scheduledThreadPool=Executors.newScheduledThreadPool(6);
4.單執行緒化的執行緒池 單次執行,按照順序
ExecutorService singleThreadExecutor=Executors.newSingleThreadExecutor();
用法
// 快取執行緒池:執行第二個執行緒時,第一個已經執行完畢,則復當前執行緒,節省開銷
for(int i=0;i<10;i++){
final int index=i;
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
cachedThreadPool.execute(new Runnable() {
@Override
public void run() {
Log.i("mao","當前i="+index);
}
});
}
//定長執行緒池:同一時間執行最大併發執行緒,其餘執行緒在佇列中等待
for(int i=0;i<10;i++){
final int index=i;
fixedThreadPool.execute(new Runnable() {
@Override
public void run() {
Log.i("mao","當前i="+index);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
}
//定長執行緒池:性延遲2秒後每三秒執行一次執行緒池
for(int i=0;i<10;i++){
final int index=i;
scheduledThreadPool.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
Log.i("mao","當前i="+index);
}
},2,3, TimeUnit.SECONDS);
}
//單執行緒化的執行緒池:順序執行,只有一個工作執行緒在實行任務
for(int i=0;i<10;i++){
final int index=i;
singleThreadExecutor.execute(new Runnable() {
@Override
public void run() {
Log.i("mao","當前i="+index);
}
});
}
</php>
看了兩個多小時的執行緒和執行緒池快要吐了,我去,不過收穫還是不小的,如果上面的內容對你有幫助,那就很開心了。有需要的可以留言,謝謝大家了。