多线程基础学习

在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(“指定线程名称”)//唤醒指定线程

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值