java多线程处理

时间:2022-04-02 18:32:08

关于java多线程,目前我用到过两种情况,一种是开启线程池用多线程处理业务逻辑,直接执行不回调。另一种是需要处理之后进行结果回调的。现将两种情况进行简单的整理分享:

一、基于实现Runnable的异步多线程处理

下面的代码是我在做一个授信项目写的,就一次为例吧

    /**
* 1,定义用于延后执行的线程池
*/

private ScheduledExecutorService ses = Executors.newScheduledThreadPool(20);

/**
* 2,所需要的业务逻辑,内部通过匿名类实现开启多线程
*/

public void preCreditAsyn(final PreCreditAsynRequest request) {

// 异步调授信
Runnable runnable = new Runnable() {
@Override
public void run() {
PreCreditRequest tmpReq = new PreCreditRequest();
tmpReq.uid = request.uid;
tmpReq.authChannel = request.authChannel;
Response<PreCreditResponse> tmpRsp = preCredit(tmpReq);
LOG.info("preCreditAsyn, do preCredit, tmpReq = " + tmpReq);
LOG.info("preCreditAsyn, do preCredit, tmpRsp = " + tmpRsp);
}
};
ses.schedule(runnable, 0, TimeUnit.SECONDS);
}

以上方法,每调用一次则开启一个新的线程,可以写在for循环中,不需要等待结果,直接对此方法调用n次,开启多线程。

二、基于实现Callable的多线程异步回调处理

这种情形我是在一个回调通知的情况下遇到的,需要定时回调给app客户端数据,但是要等待app段确认接收成功的消息反馈,因此上面的Runnable方法无法实现,并不能满足需求,而Callable却可以。

public class CallableFutureTest {

@SuppressWarnings("unchecked")
public static void main(String[] args) throws ExecutionException,
InterruptedException {
// 创建一个线程池
ExecutorService pool = Executors.newFixedThreadPool(20);
CallableFutureTest test = new CallableFutureTest();

// 创建两个有返回值的任务
Callable c1 = test.new MyCallable("A");
Callable c2 = test.new MyCallable("B");

// 执行任务并获取Future对象
Future f1 = pool.submit(c1);
Future f2 = pool.submit(c2);

// 从Future对象上获取任务的返回值,并输出到控制台
System.out.println(">>>" + f1.get().toString());
System.out.println(">>>" + f2.get().toString());*/

for(int i = 0; i < 10 ;i++){
Callable c = test.new MyCallable(GO.string(i));
Future f = pool.submit(c);
// Thread.sleep(1000);
System.out.println(">>>" + f.get().toString());
}
// 关闭线程池
pool.shutdown();
}

@SuppressWarnings("unchecked")
class MyCallable implements Callable {
private String name;

MyCallable(String name) {
this.name = name;
}

public Object call() throws Exception {
Thread.sleep(2000);
return name + "任务返回的内容";
}
}
}

代码如上,其中Callable和Future是写在需要开启多线程的业务中。而线程需要处理的具体内容及返回结果的产生是在MyCallable的call()方法中

三、Callable和Runnable的区别在哪里:

Callable和Runnable的区别如下:

  1. Callable定义的方法是call,而Runnable定义的方法是run。

  2. Callable的call方法可以有返回值,而Runnable的run方法不能有返回值。

  3. Callable的call方法可抛出异常,而Runnable的run方法不能抛出异常。