java Async异步中使用Thread.sleep会阻断主线程,急求解决方法

weixin_38316591 2019-12-13 12:01:05
public void a(){

b()
System.out.print(1)
}

@Async
public void b(){

Thread.sleep(10000)
System.out.print(2)
}
如上述 代码会先打印1,然后等待异步执行结束后再打印2,这样的话异步的效果就没有了,求解决方法
...全文
1847 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
海里的顽石 2019-12-13
  • 打赏
  • 举报
回复
你是用的spring吗?
用这个Async注解,需要在配置类上加@EnableAsync的,不然不生效的。

举个springboot的例子
oschina_41457687 2019-12-13
  • 打赏
  • 举报
回复
同一个类的方法互相调用代理不会生效
qybao 2019-12-13
  • 打赏
  • 举报
回复
引用 11 楼 weixin_38316591 的回复:
不讨论了,不用异步了,还是用线程去写吧

貌似调用异步方法的方法,不能和异步方法在同一个类
weixin_38316591 2019-12-13
  • 打赏
  • 举报
回复
不讨论了,不用异步了,还是用线程去写吧
weixin_38316591 2019-12-13
  • 打赏
  • 举报
回复
引用 9 楼 qybao 的回复:
[quote=引用 6 楼 weixin_38316591 的回复:] 写错了,想要的结果是先1后2,实际上是先2后1
那说明你的异步注解没生效,启动类有@EnableAsync注解吗?[/quote]有,异步是生效的,但是异步里面用Thread.sleep会阻断主线程,异步就会失效,所以现在需要一个解决方法
qybao 2019-12-13
  • 打赏
  • 举报
回复
引用 6 楼 weixin_38316591 的回复:
写错了,想要的结果是先1后2,实际上是先2后1

那说明你的异步注解没生效,启动类有@EnableAsync注解吗?
weixin_38316591 2019-12-13
  • 打赏
  • 举报
回复
引用 7 楼 a975719898 的回复:
你可以尝试 把 a方法中 b() 放在打印语句的下边
大哥,异步的目的就是让b里面的逻辑不影响a的响应。
阿豆响当当 2019-12-13
  • 打赏
  • 举报
回复
你可以尝试 把 a方法中 b() 放在打印语句的下边
weixin_38316591 2019-12-13
  • 打赏
  • 举报
回复
引用 4 楼 qybao 的回复:
你不是说代码会先打印1,再打印2吗,说明主线程没休眠啊,异步方法在执行的时候主线线程继续往下执行打印1了 你想要达到什么效果?
写错了,想要的结果是先1后2,实际上是先2后1
weixin_38316591 2019-12-13
  • 打赏
  • 举报
回复
引用 3 楼 a975719898 的回复:
你的想法是 异步线程执行到某个逻辑后 休眠 是吗
是的,但是休眠不能影响主线程运行
qybao 2019-12-13
  • 打赏
  • 举报
回复
你不是说代码会先打印1,再打印2吗,说明主线程没休眠啊,异步方法在执行的时候主线线程继续往下执行打印1了
你想要达到什么效果?
阿豆响当当 2019-12-13
  • 打赏
  • 举报
回复
你的想法是 异步线程执行到某个逻辑后 休眠 是吗
weixin_38316591 2019-12-13
  • 打赏
  • 举报
回复
引用 1 楼 dkwuxiang 的回复:
你这样的代码是想干什么,你用Thread.sleep() 将异步方法休眠了,它后面的代码怎么先执行?
异步休眠的时候,主代码也会休眠。想要实现的是异步独立休眠,主代码不影响
dkwuxiang 2019-12-13
  • 打赏
  • 举报
回复
你这样的代码是想干什么,你用Thread.sleep() 将异步方法休眠了,它后面的代码怎么先执行?

50,528

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧