package com.zwx.concurrent.threadPool;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class TestThreadPool {
public static void main(String[] args) {
//FixedThreadPool - 固定线程数
ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3);
for (int i=0;i<10;i++){
fixedThreadPool.execute(()-> {
System.out.println(“线程名:” + Thread.currentThread().getName());
});
}
fixedThreadPool.shutdown();
}
}
输出结果为:
可以看到,最多只有3个线程在循环执行任务(运行结果是不一定的,但是最多只会有3个线程)。
FixedThreadPool调用了如下方法构造线程池:
只有一个工作线程的执行器。如果这个线程在正常关闭前因为执行失败而被关闭,那么就会重新创建一个新的线程加入执行器。
这种执行器可以保证所有的任务按顺序执行,并且在任何给定的时间内,确保活动的任务只有1个。
示例
package com.zwx.concurrent.threadPool;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class TestThreadPool {
public static void main(String[] args) {
ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
for (int i=0;i<9;i++){
singleThreadExecutor.execute(()-> {
System.out.println(“线程名:” + Thread.currentThread().getName());
});
}
}
}
singleThreadExecutor.shutdown();
运行结果只有1个线程:
SingleThreadExecutor调用了如下方法构造线程池:
一个在需要处理任务时才会创建线程的线程池,如果一个线程处理完任务了还没有被回收,那么线程可以被重复使用。
当我们调用execute方法时,如果之前创建的线程有空闲可用的,则会复用之前创建好的线程,否则就会创建新的线程加入到线程池中。
创建好的线程如果在60s内没被使用,那么线程就会被终止并移出缓存。因此,这种线程池可以保持长时间空闲状态而不会消耗任何资源。
示例
package com.zwx.concurrent.threadPool;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class TestThreadPool {
public static void main(String[] args) {
ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
for (int i=0;i<9;i++){
cachedThreadPool.execute(()-> {
System.out.println(“线程名:” + Thread.currentThread().getName());
});
}
cachedThreadPool.shutdown();
}
输出结果可以看到,创建了9个不同的线程:
接下来我们对上面的示例改造一下,在执行execute之前休眠一段时间:
package com.zwx.concurrent.threadPool;
import java.uti