线程池的使用
以成员变量的方式创建线程池:
线程池各个参数的详细说明:https://ifeve.com/java-threadpool/
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
public class TestThreadPool {
public static final ThreadPoolExecutor POOL_EXECUTOR = new ThreadPoolExecutor
(Runtime.getRuntime().availableProcessors(), Runtime.getRuntime().availableProcessors() * 2, 0L,
TimeUnit.MILLISECONDS, new ArrayBlockingQueue<>(1024), new ThreadPoolFactory("ThreadPool"));
//execute方法
public void function(String str, Integer num) {
POOL_EXECUTOR.execute(() -> demo(str, num));
}
public void demo(String str, Integer num) {
}
public void functionTwo(String str, Integer num) {
POOL_EXECUTOR.submit(() -> {
if (null != str) {
System.out.println(123);
}
});
}
}
//用于设置创建线程的工厂,可以通过线程工厂给每个创建出来的线程设置更有意义的名字
class ThreadPoolFactory implements ThreadFactory{
private String prefix;
private int count;
public ThreadPoolFactory(String prefix){
this.prefix = prefix;
this.count = 0;
}
@Override
public Thread newThread(Runnable r) {
++this.count;
return new Thread(r, this.prefix + "-Thread-" +this.count);
}
}
类似于线程池 TaskExecutor的使用
import lombok.extern.slf4j.Slf4j;
/**
* */
@Slf4j
public class SignSendTask implements Runnable {
private String orgOrder;
private String channelId;
//构造器用于传参
public SignSendTask(String orgOrder,String channelId) {
this.orgOrder = orgOrder;
this.channelId = channelId;
}
/**
* 重写run方法
*/
@Override
public void run() {
//执行逻辑
System.out.println(orgOrder,channelId);
}
}
class Function{
//TaskExecutor 类似于线程池
@Resource(name = "quitTaskExecutor")
private TaskExecutor quitTaskExecutor;
public void demo() {
//实现了Runnable接口
quitTaskExecutor.execute(new SignSendTask(orgOrder, channelId));
//没有实现Runnable接口 也不重写run方法
quitTaskExecutor.execute(new Runnable() {
@Override
public void run() {
//执行逻辑
System.out.println(orgOrder,channelId);
}
});
//lamda表达式的方式
quitTaskExecutor.execute(() -> {
});
}
}