场景:
有两个比较耗时的计算操作需要连接mongodb,同步执行可能需要7s,异步执行之后需要4s
代码
package callable_demo;
import com.alibaba.fastjson.JSONObject;
import org.omg.CORBA.TIMEOUT;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
import java.util.concurrent.TimeUnit;
public class CallableDemo {
public static void main(String[] args) throws ExecutionException, InterruptedException {
new Thread(new MyThread(), "AAA").start();
FutureTask futureTask = new FutureTask(new MyThread2(2));
Thread thread = new Thread(futureTask, "BBB");
thread.start();
new Thread(futureTask,"CCC").start();
while (!futureTask.isDone()){
}
System.out.println();
System.out.println("######result"+futureTask.get());
FutureTask futureTaskMockName = new FutureTask(new MockName("张三"));
Thread threadMockName = new Thread(futureTaskMockName,"futureTaskMockName");
threadMockName.start();
FutureTask futureTaskMockAddress = new FutureTask(new mockAddressCallable("张家屯"));
Thread threadMockAddress = new Thread(futureTaskMockAddress,"futureTaskMockAddress");
threadMockAddress.start();
System.err.println("futureTaskMockName:"+futureTaskMockName.get());
System.err.println("futureTaskMockAddress:"+futureTaskMockAddress.get());
System.err.println("所有线程执行完毕!");
System.out.println("嘿嘿嘿");
}
}
class MyThread implements Runnable {
@Override
public void run() {
}
}
class MyThread2 implements Callable<Integer> {
private Integer num;
public MyThread2(Integer i) {
this.num = i;
}
@Override
public Integer call() throws Exception {
try{
TimeUnit.SECONDS.sleep(2);
}catch (Exception e){
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"\t come in =====");
return num;
}
}
class MockName implements Callable<List<JSONObject>> {
private final String name;
public MockName(String name) {
this.name = name;
}
@Override
public List<JSONObject> call() throws Exception {
System.err.println(Thread.currentThread().getName()+"\t come in =====");
List<JSONObject> result = new ArrayList<>();
for (int i = 0; i < 500; i++) {
JSONObject json = new JSONObject();
json.put("name", name);
json.put("age", ++i);
result.add(json);
}
return result;
}
}
class mockAddressCallable implements Callable<List<JSONObject>> {
private final String address;
public mockAddressCallable(String address) {
this.address = address;
}
@Override
public List<JSONObject> call() throws Exception {
return mockAddress(address);
}
List<JSONObject> mockAddress(String address) {
List<JSONObject> result = new ArrayList<>();
for (int i = 0; i < 500; i++) {
JSONObject json = new JSONObject();
json.fluentPut("name", "张山");
json.fluentPut("address", address + (++i) + "号胡同");
result.add(json);
}
return result;
}
}