
在创建线程的使用,可以借用不同的Thread类解决,我们可以根据线程池的大小和其中的线程数量进行选择。这里给大家带来了四种方式:newCachedThreadPool、newFixedThreadPool、newScheduledThreadPool、newSingleThreadExecutor。在接下来的内容中,我们会分别就这个方式的类型和代码示例带来分享。
1. newCachedThreadPool
创建一个线程池,如果线程池中的线程数量过大,它可以有效的回收多余的线程,如果线程数不足,那么它可以创建新的线程。
1 | public static void method() throws Exception { ExecutorService executor = Executors.newCachedThreadPool(); for (int i = 0; i < 5; i++) { final int index = i; Thread.sleep(1000); executor.execute( new Runnable() { @Override public void run() { System.out.println(Thread.currentThread().getName() + " " + index); } }); }}
|
2. newFixedThreadPool
创建固定大小的线程池。每次提交一个任务就创建一个线程,直到线程达到线程池的大小。线程池的大小一旦达到值就会保持不变,如果某个线程因为执行异常而结束,那么线程池会补充一个新线程。
1 | public static void method_01() throws InterruptedException { ExecutorService executor = Executors.newFixedThreadPool(1); for (int i = 0; i < 10; i++) { Thread.sleep(1000); final int index = i; executor.execute(() -> { try { Thread.sleep(2 * 1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + " " + index); }); } executor.shutdown();}
|
3. newScheduledThreadPool
创建一个大小的线程池。此线程池支持定时以及周期性执行任务的需求。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | public class TestScheduledThreadPoolExecutor {
public static void main(String[] args) {
ScheduledThreadPoolExecutor exec = new ScheduledThreadPoolExecutor(1);
exec.scheduleAtFixedRate( new Runnable() {
@Override
publicvoid run() {
System.out.println( "================" );
}
}, 1000, 5000, TimeUnit.MILLISECONDS);
exec.scheduleAtFixedRate( new Runnable() {
@Override
publicvoid run() {
System.out.println(System.nanoTime());
}
}, 1000, 2000, TimeUnit.MILLISECONDS);
}
}
|
4.newSingleThreadExecutor
单个线程的线程池,即线程池中每次只有一个线程工作,单线程串行执行任务。
1 2 3 4 5 6 7 8 9 10 11 | public class MyThread extends Thread {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + "正在执行。。。" );
}
}
|
以上就是java线程池创建方式,在创建之前,需要我们根据线程池的需求进行判断。学会了它们的概念后,赶快动手试试创建自己需要的线程池吧。