在service
第一种是:
new Thread(new Runnable() {
@Override
public void run() {
}
});
第二种是:
Callable<JSONObject> entityCallable=new Callable<JSONObject>() {
@Override
public JSONObject call() throws Exception {
return null;
}
};
从此看出runnable和callable的区别在于:
@1.runnable重写的run方法,callable重写的call方法
@2.runnable不能抛异常,callable可以抛异常
@3.runnable没有返回值,而callable有返回值
他们的联系是:
@1.都是接口,call方法是在run方法中执行的。
这里只总结第二种多线程实现方式:
第二步:
FatureTask<JOSNObject> entityCallballableFatureTask=new FatureTask<>(entityCallable)
第三步:开启线程
new Thread(entityCallballableFatureTask).run();
第四步:将结果集给JSONObject返回
JSONObject result=new JSONObject();
result.putAll(entityCallballableFatureTask.get());
return result;
到此一个简单多线程查询就结束了。
原理篇:
那么FatureTask是一个什么东西呢?
我们打开源码就会发现futureTask是一个实现RunnableFuture接口的一个类
而runnableFature是继承自runnable的一个接口
其中,FatureTask主要有六个状态:
0-new;1- completing 执行完毕 完成分为两种状态第一种是:正常结束2-nomal ,第二种是异常结束3-exceptional; 4-cancelled取消 5-interrupting 准备打断 6-interrupted已通知被打断。
entityCallballableFatureTask.get()中的get()当没有从faturetask中拿到值时,就会堵塞线程。
就是get一直循环判断状态,若执行完毕,则返回结果。若没有执行完毕,则通过park将线程挂起并加入到等待队列中。
若一个线程结果执行完毕,那么它的执行(执行finishcompletion方法结束线程)。然后在等待队列中,通知主线程,继续向下执行。若队列执行完毕,则主线程执行完毕。
wait、notify与park、unpark的区别在于
@1.wait、notify针对于对象,park、unpark针对于线程
@2.前面是先wait,后notify,后面是park、unpark无顺序要求
@3.notifyAll可以一次唤醒多个线程,后面只能唤醒指定线程
LockSupport.part();等待
LockSupport.unpark(“指定线程名称”)//唤醒指定线程