自定义带返回参数和没有返回参数的两种线程池
- 自定义线程池的名称
public class NamesThreadFactory implements ThreadFactory {
private final ThreadGroup group;
private final AtomicInteger threadNumber = new AtomicInteger(1);
private final String namePrefix;
public NamesThreadFactory(String name){
SecurityManager s = System.getSecurityManager();
group = (s != null) ? s.getThreadGroup() : Thread.currentThread().getThreadGroup();
if (null == name || name.isEmpty()) {
name = "my-pool";
}
namePrefix = name + "-thread-";
}
@Override
public Thread newThread(Runnable r) {
Thread t = new Thread(group, r, namePrefix + threadNumber.getAndIncrement(), 0);
if (t.isDaemon())
t.setDaemon(false);
if (t.getPriority() != Thread.NORM_PRIORITY)
t.setPriority(Thread.NORM_PRIORITY);
return t;
}
}
- 自定义线程基础类(使用 implements Callable来实现带有返回参数的线程池)
public class CustomizedThreadPool extends ThreadPoolExecutor{
private ExecutorService executorService;
public CustomizedThreadPool(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler
) {
super(corePoolSize, maximumPoolSize, keepAliveTime, unit,workQueue, threadFactory, handler);
executorService = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, unit,
workQueue, threadFactory, handler);
}
public Future<Boolean> submits(Callable<Boolean> callable) {
return executorService.submit(callable);
}
public Future<?> submit(Runnable runnable) {
return executorService.submit(runnable);
}
}
- 自定义线程池
public class ExecuteThreadTest {
private CustomizedThreadPool customizedThreadPool = new CustomizedThreadPool(
50,100,600,TimeUnit.SECONDS,
new LinkedBlockingQueue<>(),new NamesThreadFactory("mytestThread"),new ThreadPoolExecutor.CallerRunsPolicy()
);
}
public class MyDefineThreadPool implements Callable<Boolean> {
private String code;
private String name;
public MyDefineThreadPool(String code,String name){
this.code= code;
this.name= name;
}
@Override
public Boolean call() throws Exception {
try {
System.out.println("====执行业务逻辑====start====");
System.out.println("code: " + code+ "name: " + name);
System.out.println("线程名称为:" +Thread.currentThread().getName());
System.out.println("====执行业务逻辑====end====");
} catch (Exception e) {
e.printStackTrace();
return false;
}
return true;
}
}
public void execute(){
List<Future<Boolean>> futures = new LinkedList();
Future<Boolean> future;
for(int i =0;i<=9 ;i++){
future = customizedThreadPool.submits(new MyDefineThreadPool("test", "测试"));
futures.add(future);
}
boolean computeSucceed = Boolean.TRUE;
try {
for (Future<Boolean> resultFuture : futures) {
Boolean threadResult = resultFuture.get();
if (!threadResult ) {
computeSucceed = Boolean.FALSE;
break;
}
}
} catch (Exception e) {
e.printStackTrace();
}
if(!computeSucceed){
System.out.println("线程执行存在异常了===========");
}
}
- 直接可以使用main方法去调用execute方法来测试了。
- 1-4中使用的是使用implements Callable来实现了带有返回参数的线程池,同时也可以使用Runnable来实现不带返回参数的线程池。
public class MyRunnableThreadPool implements Runnable{
private String code;
private String name;
public MyRunnableThreadPool(String code,String name){
this.code= code;
this.name= name;
}
@Override
public void run() {
try {
System.out.println("====执行业务逻辑===Runnable =start====");
System.out.println("code: " + code + "name: " + name);
System.out.println("线程名称为:" +Thread.currentThread().getName());
System.out.println("====执行业务逻辑===Runnable =end====");
} catch (Exception e) {
e.printStackTrace();
}
}
}