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>
看了两个多小时的线程和线程池快要吐了,我去,不过收获还是不小的,如果上面的内容对你有帮助,那就很开心了。有需要的可以留言,谢谢大家了。