原始的线程池 请先到这里学习https://blog.csdn.net/u011531613/article/details/61921473
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
//线程池
public class Threadpoolss {
public static void main(String[] args) {
ThreadPoolExecutor executor = new ThreadPoolExecutor(10, 15, 200, TimeUnit.MILLISECONDS,
new ArrayBlockingQueue<Runnable>(5));
//线程池里面先执行10个 如果超过10个 那么就会放到ArrayBlockingQueue如果放到这里面超过5个 那么就会往线程池加,加到封顶15个
//线程池先加达到第一个参数10。而后加到等待queue队列,队列加了5个满了。就从10个在继续加到线程池第二个参数15。总共可以加20个(队列5个+线程池最大15个)
for(int i=0;i<20;i++){
MyTask myTask = new MyTask(i);
executor.execute(myTask);
System.out.println("线程池中线程数目:"+executor.getPoolSize()+",队列中等待执行的任务数目:"+
executor.getQueue().size()+",已执行玩别的任务数目:"+executor.getCompletedTaskCount());
}
executor.shutdown();
}
}
class MyTask implements Runnable {
private int taskNum;
public MyTask(int num) {
this.taskNum = num;
}
@Override
public void run() {
System.out.println("正在执行task "+taskNum);
try {
Thread.currentThread().sleep(4000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("task "+taskNum+"执行完毕");
}
}
但是通用的是这四种。
第一种 newFixedThreadPool 固定线程池的大小
public class test4{
public static void main(String[] args) {
ExecutorService pool=Executors.newFixedThreadPool(3);
Thread t1=new Thread(new MyThread());
Thread t2=new Thread(new MyThread());
Thread t3=new Thread(new MyThread());
Thread t4=new Thread(new MyThread());
Thread t5=new Thread(new MyThread());
Thread t6=new Thread(new MyThread());
pool.execute(t1);pool.execute(t2);pool.execute(t3);
pool.execute(t4);pool.execute(t5);pool.execute(t6);
pool.shutdown();
}
}
class MyThread implements Runnable{
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println(Thread.currentThread().getName() + "正在执行");
}
}
输出:
pool-1-thread-2正在执行
pool-1-thread-1正在执行
pool-1-thread-3正在执行
pool-1-thread-3正在执行
pool-1-thread-1正在执行
pool-1-thread-2正在执行
可以看出 固定3个
第二种 单任务
public class test4{
public static void main(String[] args) {
//ExecutorService pool=Executors.newFixedThreadPool(3);
ExecutorService pool=Executors.newSingleThreadExecutor();
Thread t1=new Thread(new MyThread());
Thread t2=new Thread(new MyThread());
Thread t3=new Thread(new MyThread());
Thread t4=new Thread(new MyThread());
Thread t5=new Thread(new MyThread());
Thread t6=new Thread(new MyThread());
pool.execute(t1);pool.execute(t2);pool.execute(t3);
pool.execute(t4);pool.execute(t5);pool.execute(t6);
pool.shutdown();
}
}
class MyThread implements Runnable{
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println(Thread.currentThread().getName() + "正在执行");
}
}
结果
pool-1-thread-1正在执行
pool-1-thread-1正在执行
pool-1-thread-1正在执行
pool-1-thread-1正在执行
pool-1-thread-1正在执行
pool-1-thread-1正在执行
第三种 无限
public class test4{
public static void main(String[] args) {
//ExecutorService pool=Executors.newFixedThreadPool(3);
//ExecutorService pool=Executors.newSingleThreadExecutor();
ExecutorService pool=Executors.newCachedThreadPool();
Thread t1=new Thread(new MyThread());
Thread t2=new Thread(new MyThread());
Thread t3=new Thread(new MyThread());
Thread t4=new Thread(new MyThread());
Thread t5=new Thread(new MyThread());
Thread t6=new Thread(new MyThread());
pool.execute(t1);pool.execute(t2);pool.execute(t3);
pool.execute(t4);pool.execute(t5);pool.execute(t6);
pool.shutdown();
}
}
class MyThread implements Runnable{
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println(Thread.currentThread().getName() + "正在执行");
}
}
pool-1-thread-2正在执行
pool-1-thread-5正在执行
pool-1-thread-6正在执行
pool-1-thread-3正在执行
pool-1-thread-1正在执行
pool-1-thread-4正在执行
第四种 延迟连接池,newScheduledThreadPool
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
//线程池https://www.cnblogs.com/ruiati/p/6134131.html
public class test5 {
public static void main(String[] args) {
ScheduledThreadPoolExecutor exec = new ScheduledThreadPoolExecutor(1);
exec.scheduleAtFixedRate(new Runnable() {//每隔一段时间输出====
@Override
public void run() {
//throw new RuntimeException();
System.out.println("================");
}
}, 1000, 5000, TimeUnit.MILLISECONDS);//1s后启动任务 5s执行一次
exec.scheduleAtFixedRate(new Runnable() {//每隔一段时间打印系统时间,证明两者是互不影响的
@Override
public void run() {
System.out.println(System.nanoTime());
}
}, 1000, 2000, TimeUnit.MILLISECONDS);//1s后启动任务 2s执行一次
}
}
结果
================
328516611855797
328518612348847
328520612961904
================
328522611896062