android實現高性能,高並發,可延時線程池管理
為什么要使用線程池?
1.)new Thread()的缺點
- 每次new Thread()耗費性能
- 調用new Thread()創建的線程缺乏管理,被稱為野線程,而且可以無限制創建,之間相互競爭,會導致過多占用系統資源導致系統癱瘓。
- 不利於擴展,比如如定時執行、定期執行、線程中斷
2.)采用線程池的優點
- 重用存在的線程,減少對象創建、消亡的開銷,性能佳
- 可有效控制最大並發線程數,提高系統資源的使用率,同時避免過多資源競爭,避免堵塞
- 提供定時執行、定期執行、單線程、並發數控制等功能
線程池實現:
1.實現思路:
使用生產者消費者模式進行設計:通過應用層給線程池提供 線程隊列(生產者),線程池執行線程隊列(消費者)
由線程池設定最大線程數,當在排隊的線程數超過線程池最大數量,線程池會拒絕執行,被拒絕執行的線程將被從新
放入線程隊列進行排隊
生產者:線程隊列(阻塞隊列)
消費者:線程池
拒絕機制:當排隊的線程進入線程池被拒絕后,重新放入隊列,重新排隊
設計思路
具體代碼實現:
ThreadPoolManager:
public class ThreadPoolManager {
private static ThreadPoolManager instance=new ThreadPoolManager();
public static ThreadPoolManager getInstance() {
return instance;
}
private ThreadPoolExecutor threadPoolExecutor;
private LinkedBlockingQueue<Future<?>> service=new LinkedBlockingQueue<>();
private ThreadPoolManager(){
threadPoolExecutor=new ThreadPoolExecutor(4,10,10, TimeUnit.SECONDS,
new ArrayBlockingQueue<Runnable>(4),handler);
threadPoolExecutor.execute(runnable);
}
private Runnable runnable=new Runnable() {
@Override
public void run() {
while (true) {
FutureTask futureTask = null;
try {
Log.e("myThreadPook","service size "+service.size());
futureTask = (FutureTask) service.take();
Log.e("myThreadPook","池 "+threadPoolExecutor.getPoolSize());
} catch (InterruptedException e) {
e.printStackTrace();
}
if (futureTask != null) {
threadPoolExecutor.execute(futureTask);
}
}
}
};
public <T> void execute(final FutureTask<T> futureTask, Object delayed){
if(futureTask!=null){
try {
if(delayed!=null){
Timer timer=new Timer();
timer.schedule(new TimerTask(){
public void run(){
try {
service.put(futureTask);
} catch (InterruptedException e) {
e.printStackTrace();
}
}},(long)delayed);
}else {
service.put(futureTask);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
private RejectedExecutionHandler handler=new RejectedExecutionHandler() {
@Override
public void rejectedExecution(Runnable runnable, ThreadPoolExecutor threadPoolExecutor) {
try {
service.put(new FutureTask<Object>(runnable,null));//
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
}
應用層調用:
MainActivity:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
for (int i=0;i<100;i++){//高並發
final int finalI = i;
Thread thread =new Thread(){
@Override
public void run() {
super.run();
// Log.e("jjjjjj", "runnable---->"+ finalI);
}
};
ThreadPoolManager.getInstance().execute(new FutureTask<Object>(thread,null),null);
}
Thread thread =new Thread(){
@Override
public void run() {
super.run();
Log.e("jjjjjj", "runnable---->finalIrunnable");
}
};
ThreadPoolManager.getInstance().execute(new FutureTask<Object>(thread,null),(long)10000);//延時執行
}
}