创建线程和销毁线程会消耗资源。所以创建一个线程池是有必要的。
创建固定数量的线程池
/**
* 创建固定数量的线程池
* @author liyiruo
*/
public class TestNewFixedThreadPool {
public static void main(String[] args) {
ExecutorService fixedThreadPool = newFixedThreadPool(5);
for (int i = 0; i < 10; i++) {
final int index = i;
fixedThreadPool.execute(() -> {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + ":" + index);
});
}
fixedThreadPool.shutdown();
}
}
创建可变大小的线程池
/**
* @author liyiruo
*/
public class TestNewCachedThreadPool {
public static void main(String[] args) {
ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
//使用for循环创建线程,其实最终 只使用了一个线程。
for (int i = 0; i < 10; i++) {
final int index = i;
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
cachedThreadPool.execute(() -> {
System.out.println(Thread.currentThread().getName() + ":" + index);
});
}
cachedThreadPool.shutdown();
}
}
创建一个只有一个线程的线程池
/**
* 创建单一的线程
* @author liyiruo
*/
public class TestNewSingleThreadExecutor {
public static void main(String[] args) {
ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
for (int i = 0; i < 10; i++) {
final int index = i;
singleThreadExecutor.execute(() -> {
try {
Thread.sleep(100);
System.out.println(Thread.currentThread().getName() + ":" + index);
} catch (InterruptedException e) {
e.printStackTrace();
}
});
}
}
}
创建一个支持定时或者是周期性执行任务的线程池
/**
* 定时执行的线程
* @author liyiruo
*/
public class TestNewScheduledThreadPool {
public static void main(String[] args) {
ScheduledExecutorService scheduledThreadPool
= Executors.newScheduledThreadPool(3);
System.out.println("开始:"+System.currentTimeMillis());
for (int i = 0; i < 4; i++) {
final int index = i;
scheduledThreadPool.schedule(() -> {
System.out.println(Thread.currentThread().getName() + ":" + System.currentTimeMillis() + "==>" + index);
}, 2L, TimeUnit.SECONDS);
}
scheduledThreadPool.shutdown();
}
}
自定义一个线程池
/**
* 参数最全的线程池
* @author liyiruo
*/
public class TestThreadPoolExecutor {
public static void main(String[] args) {
int corePoolSize=30;//核心线程数
int maximumPoolSize=100;//最大线程数
long keepAliveTime=60L;//空闲线程存活时间 (空闲线程是指 核心线程之外的线程)
TimeUnit unit = TimeUnit.SECONDS;
BlockingQueue<Runnable> workQueue =new SynchronousQueue();//
BlockingQueue<Runnable> workQueue1 =new LinkedBlockingDeque<>();//
ThreadFactory threadFactory = new ThreadFactory() {
@Override
public Thread newThread(Runnable r) {
return new Thread(r);
}
};//指定创建线程的工厂
RejectedExecutionHandler handle = new ThreadPoolExecutor.DiscardPolicy();//抛弃当前线程,
RejectedExecutionHandler handle1 = new ThreadPoolExecutor.AbortPolicy();//抛出RejectedExecutorException异常
RejectedExecutionHandler handle2 = new ThreadPoolExecutor.CallerRunsPolicy();//由向线程池提交任务的线程来执行该任务
RejectedExecutionHandler handle3 = new ThreadPoolExecutor.DiscardOldestPolicy();//抛弃最旧线程
//这个是最齐全的线程池的构造参数
ThreadPoolExecutor executor = new ThreadPoolExecutor(
corePoolSize,
maximumPoolSize,
keepAliveTime,
unit,
workQueue,
threadFactory,
handle);
executor.execute(()->{
System.out.println("这是一个线程池");
});
}
}