线程池的应用比较广泛,主要是让开发人员在开发过程中减少自己创建线程,管理线程的细节。
1、核心线程开始执行
2、还有新任务,就填充到阻塞队列中,等待核心线程执行
3、阻塞队列满了,就开始创建新的线程,也就是第二个参数maximumPoolSize的数量了
4、如果达到了第二个参数的最大值,就会跑到RejectedExecutionHandler最后一个参数中的错误处理中
简单代码如下:
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
private Button bt1;
private Button bt2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bt1 = findViewById(R.id.testBt);
bt1.setOnClickListener(v -> {
Log.d("ZTL","Button1");
ExecutorService pool = new ThreadPoolExecutor(2,4,3, TimeUnit.SECONDS,
new ArrayBlockingQueue<Runnable>(10),
new ThreadPoolExecutor.DiscardOldestPolicy());
//ExecutorService pool = Executors.newCachedThreadPool();//其实是比较少
for(int i=0;i<6;i++) {
ThreadPoolTest.Worker worker = new ThreadPoolTest.Worker("worker_"+i);
pool.execute(worker);
}
pool.shutdown();
});
bt2 = findViewById(R.id.testBt2);
bt2.setOnClickListener(v -> {
Log.d("ZTL","Button2 ");
});
}
}
public class ThreadPoolTest {
//工作线程
public static class Worker implements Runnable
{
private String taskName;
private Random r = new Random();
public Worker(String taskName){
this.taskName = taskName;
}
public String getName() {
return taskName;
}
@Override
public void run(){
Log.d("ZTL",Thread.currentThread().getName()
+" process the task : " + taskName);
try {
sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}