最近在项目中需要使用多线程的并发来处理数据,刚开始希望使用static关键字来控制总的请求数,通过加减计数来进行数据请求的调度,本来并发量就不是很高,可是在实际的实验环境中,因为不能很好的控制请求的先后顺序,达到FIFO的要求,所以准备改善优化一下。对于线程池的使用不是很熟悉,通过网上的一些实例,结合自己的实际需求,对现成的一个实例,进行了优化,希望给各位有新的启发。
根据需求,主要做两方面的改正:
1.要对子线程的结果进行判断,这要求ExecutorService的执行结果必须有返回值
2.要捕获子线程的自定义异常。
首先第1点,获取任务的执行的返回值。
ExecutorService能够执行的任务分两类:一类是实现了Runnable接口的类,一类是实现了Callable接口的类。两者都可以被ExecutorService执行,但是Runnable任务没有返回值,而Callable任务有返回值。并且Callable的call()方法只能通过ExecutorService的(<T> task) 方法来执行,并且返回一个<T><T>,是表示任务等待完成的 Future。故此选定实现接口为callable。
import java.util.Random;
import java.util.concurrent.Callable;
public class TaskWithResult implements Callable<String> {
private int id;
private static final String RESULT_NG_39 = "39";
public TaskWithResult(int id) {
this.id = id;
}
/**
* 任务的具体过程,一旦任务传给ExecutorService的submit方法,则该方法自动在一个线程上执行。
*
* @return
* @throws Exception
*/
public String call() throws TaskException {
System.out.println("call()方法被自动调用,干活!!! "
+ Thread.currentThread().getName());
if (new Random().nextBoolean())
// 此处为自定义的exception, 包含返回的error code,在实际的开发中,不同的错误会对应