首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么Future阻塞主线程?

Future阻塞主线程是因为Future是一种异步编程的方式,它允许在主线程中发起一个耗时的操作,并在后台线程中执行该操作。当主线程遇到Future的get()方法时,它会等待后台线程完成操作并返回结果,这个过程会阻塞主线程的执行。

Future的阻塞主要有两种情况:

  1. 如果后台线程还没有完成操作,主线程调用Future的get()方法时会被阻塞,直到后台线程完成操作并返回结果。
  2. 如果后台线程执行操作过程中发生异常,主线程调用Future的get()方法时也会被阻塞,直到后台线程抛出异常或者完成操作并返回结果。

虽然Future阻塞主线程,但它的设计初衷是为了解决主线程阻塞的问题。通过将耗时的操作放在后台线程中执行,主线程可以继续执行其他任务,提高了程序的并发性和响应性。

在实际应用中,可以通过使用线程池来管理后台线程,避免频繁地创建和销毁线程,提高了线程的复用性和效率。同时,可以使用CompletableFuture等工具类来处理Future的结果,实现更加灵活的异步编程。

腾讯云相关产品推荐:

  • 云服务器(CVM):提供弹性计算能力,支持按需创建、管理和释放云服务器实例。链接:https://cloud.tencent.com/product/cvm
  • 弹性伸缩(AS):自动调整云服务器实例数量,根据业务需求进行弹性扩容和缩容。链接:https://cloud.tencent.com/product/as
  • 云数据库MySQL版(CDB):提供高可用、可扩展的MySQL数据库服务,支持自动备份、容灾和监控。链接:https://cloud.tencent.com/product/cdb
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Java线程阻塞

阻塞指的是暂停一个线程的执行以等待某个条件发生(如某资源就绪),学过操作系统的同学对它一 定已经很熟悉了。Java 提供了大量方法来支持阻塞,下面让我们逐一分析。   ...典型地,suspend() 和 resume() 被用在等待另一个线程产生的结果的情形:测试发现结果还没有产生后,让线程阻塞,另一个 线程产生了结果后,调用 resume() 使其恢复。   ...3. yield() 方法:yield() 使得线程放弃当前分得的 CPU 时间,但是不使线程阻塞,即线程仍处于 可执行状态,随时可能再次分得 CPU 时间。...而调用 任意对象的notify()方法则导致因调用该对象的 wait() 方法而阻塞线程中随 机选择的一个解除阻塞(但要等到获得锁后才真正可执行)。   ...关于 wait() 和 notify() 方法最后再说明两点:   第一:调用 notify() 方法导致解除阻塞线程是从因调用该对象的 wait() 方法而阻塞线程中随 机选取的,我们无法预料哪一个线程将会被选择

1.1K10

为什么线程不会因为Looper.loop()方法造成阻塞

Looper.prepareMainLooper(); Looper.loop(); 主线程阻塞 关于死循环 主线程进入一个死循环,是不是就会被阻塞?...首先,思考一下,如果我们创建一个线程做定时检查某个状态,是不是也会给这个子线程做一个死循环,不断地去循环检查状态。当不需要这个线程的时候,改变flag让这个子线程退出循环并销毁。...你不给我消息,我就会阻塞,减少CPU消耗(涉及到epoll)。 那么主线程会响应什么消息呢?...所以: Looper的阻塞,前提是没有输入事件,此时MessageQueue是空的,Looper进入空闲,线程进入阻塞,释放CPU,等待输入事件的唤醒。...先上结论和上面的做个对比: UI耗时导致卡死,前提是要有输入事件,此时MessageQueue不是空的,Looper正常轮询,线程并没有阻塞,但是该事件执行时间过长(一般5秒),而且与此期间其他的事件(

2.6K10

Java线程(七):Callable和Future

Callable接口类似于Runnable,从名字就可以看出来了,但是Runnable不会返回结果,并且无法抛出返回结果的异常,而Callable功能更强大一些,被线程执行后,可以返回值,这个返回值可以被...Future拿到,也就是说,Future可以拿到异步执行任务的返回值,下面来看一个简单的例子: public class CallableAndFuture { public static void...,所以它既可以作为Runnable被线程执行,又可以作为Future得到Callable的返回值,那么这个组合的使用有什么好处呢?...假设有一个很耗时的返回值需要计算,并且这个返回值不是立刻需要的话,那么就可以使用这个组合,用另一个线程去计算返回值,而当前线程在使用这个返回值之前可以做其它的操作,等到需要这个返回值时,再通过Future...} }        代码是不是简化了很多,ExecutorService继承自Executor,它的目的是为我们管理Thread对象,从而简化并发编程,Executor使我们无需显示的去管理线程的生命周期

54000

阻塞队列中的线程协作(阻塞、唤醒、锁)

自己写一个阻塞队列 阻塞队列,主要操作有两个,一个是put放入元素,另一个是take取出元素。所谓的阻塞就是当多个线程同时存取数据时,如果遇到队列为空或者队列为满时,会发生阻塞。...并且多个线程同时执行take或者put操作时,某一时刻只有一个线程获得执行权利,也就是执行任何一个操作之前需要获得锁,没有获得锁的线程发生阻塞。...如果正常存入了元素,那么唤醒其他阻塞线程(有些执行take操作的线程因为队列为空而阻塞) take: 从队列中取一个元素,如果队列为空,则阻塞当前线程,等待唤醒。...如果正常取出了元素,那么唤醒其他阻塞线程(有些执行put操作的线程因为队列满而阻塞) Object类提供了几个操作来进行当前线程的唤醒和阻塞。...,不然再想put的线程就会被阻塞

1.2K30

《多线程系列二》不理解future怎么能有future

《多线程系列二》不理解future怎么能有future? 今天说下futureFuture是一个interface,可以方便的用于异步结果的获取。...项目需求:每个游戏都有世界BOSS的功能,因为世界boss 是涉及所有的玩家的,为了控制多线程的复杂度,会启动一个单线程线程池控制整个流程,但是玩家的消息线程又需要获得当前世界boss 的信息,所以就有需求从单线程中获取...future就可以解决这个问题。下面一起理解future和使用future。 1、Future的类图结构,从整体上看下Future的结构 首先看下future接口的函数,共有5个方法。...看下上面的代码就是在获取结果的时候,会先判断状态是否完成,如果完成了就正常返回结果,如果没完成就会调用awaitDone,看名字也能看出来就是等待直到完成,进入代码可以看到就是将进入死循环检查状态,线程阻塞等待...下次写什么还没定,总之最近会一直写多线程东西,做个总结。 打字不容易,点赞,转发,关注三连,谢谢大家,对了,关注我公众号:【香菜聊游戏】有更多福利哦。常规福利双手送上。 《多线程系列一》线程是什么?

25410

《多线程系列二》不理解future怎么能有future

《多线程系列二》不理解future怎么能有future? ? 今天说下futureFuture是一个interface,可以方便的用于异步结果的获取。...项目需求:每个游戏都有世界BOSS的功能,因为世界boss 是涉及所有的玩家的,为了控制多线程的复杂度,会启动一个单线程线程池控制整个流程,但是玩家的消息线程又需要获得当前世界boss 的信息,所以就有需求从单线程中获取...future就可以解决这个问题。下面一起理解future和使用future。 1、Future的类图结构,从整体上看下Future的结构 ? ? 首先看下future接口的函数,共有5个方法。...看下上面的代码就是在获取结果的时候,会先判断状态是否完成,如果完成了就正常返回结果,如果没完成就会调用awaitDone,看名字也能看出来就是等待直到完成,进入代码可以看到就是将进入死循环检查状态,线程阻塞等待...下次写什么还没定,总之最近会一直写多线程东西,做个总结。 打字不容易,点赞,转发,关注三连,谢谢大家,对了,关注我公众号:【香菜聊游戏】有更多福利哦。常规福利双手送上。

47450

线程阻塞和唤醒

Java的线程阻塞和唤醒是通过Unsafe类的park和unpark方法做到的。 两个方法都是native方法,本身由c实现的核心功能。...Thread内部有个parkBlocker属性,保存来当前线程为什么而park。起到一系列冲突线程的管理的协调者,哪个线程该休眠该唤醒都是由他来控制的。...线程对象里面的parkBlocker字段值是排队管理器。 当多个线程争用一把锁时,必须排队机制将那些没能取得锁的线程串在一起。 当释放锁时,锁管理器就会挑选一个合适的线程来占有这个刚刚释放的锁。...线程在执行Lock.park方法时会自我休眠,并不是非得等到其他线程unpark了才会唤醒,它可能因为某种未知原因醒来,park返回原因有四种: 其他线程unpark了当前线程。...可以引入signal()和await()方法,当条件满足时,调用signal()或者signalAll()方法,阻塞线程可以立即被唤醒几乎没有任何延迟。

1.5K30

Java多线程之Callable和Future

Callable接口类似于Runnable,从名字就可以看出来了,但是Runnable不会返回结果,并且无法抛出返回结果的异常,而Callable功能更强大一些,被线程执行后,可以返回值,这个返回值可以被...,所以它既可以作为Runnable被线程执行,又可以作为Future得到Callable的返回值,那么这个组合的使用有什么好处呢?...假设有一个很耗时的返回值需要计算,并且这个返回值不是立刻需要的话,那么就可以使用这个组合,用另一个线程去计算返回值,而当前线程在使用这个返回值之前可以做其它的操作,等到需要这个返回值时,再通过Future...CompletionService.take 会获取并清除已经完成Task的结果,如果当前没有已经完成Task时,会阻塞。 2....两个方法最大的差别在于遍历 Future 的顺序,相对来说, CompletionService 的性能更高。考虑如下场景:多线程下载,结果用Future返回。第一个文件特别大,后面的文件很小。

59920

线程(四) | 聊聊Callable和Future

通过前面几篇文章,我相信大家应该对于如何使用多线程执行任务应该都有了一定的了解。今天我们来讲一讲Callable和Future。...创建一个Future用来执行多线程任务,构造方法中传入Callable类型变量 FutureTask futureTask = new FutureTask(c);...System.out.println(futureTask.get()); } } 打印结果: Thread-0| 正在执行有返回值任务 success 执行结果在两秒后打印出来,也证明了 get方法是个阻塞的方法...执行线程任务,获取结果 Future future = executorService.submit(c1); // 4.打印结果 System.out.println...(future.get()); } } 三、给Runnable添加返回值 如果说我们现在有一个Runnable类型的任务,也想在执行完任务的时候,给调用者返回一个结果。

30860

JUC-Java多线程Future,CompletableFuture

// 是否是守护线程 t1.isDaemon(); // 设置为守护线程 t1.setDaemon(true); setDaemon(true)方法必须在start()之前设置 Future接口 Future...总结: Future接口可以为主线程开一个分支任务,专门为主线程处理耗时和费力的复杂业务。...futureTask.get(); futureTask.isDone(); Future对于结果的获取不是很友好,只能通过阻塞或轮询的方式得到任务的结果。...CompletableFuture 从jdk1.8开始引入,它是Future的功能增强版,减少阻塞和轮询。可以传入回调对象,当异步任务完成或者发生异常时,自动调用回调对象的回调方法。...,采用默认线程会当作一个守护线程,main方法执行完后future线程还未处理完时会直接关闭 ExecutorService threadPool = Executors.newFixedThreadPool

38930

有了Future为什么还要CompletableFuture?

为什么Future?...,只能通过阻塞或轮询的方式得到结果 面对一些复杂的任务 对于简单的业务场景使用 Future 接口完全 OK 回调通知 应对 Future 的完成时间,完成之后发起回调通知 通过轮询方式去判断任务是否完成...对 Future 的改进 CompletableFuture 为什么会出现?...get()方法在 Future 计算完成之前会一直处于阻塞状态下 isDone()方法容易耗费 CPU 资源 对于真正在异步处理中我们希望可以通过传入回调函数,在 Future 结束时自动回调该函数,这样就不需要等待结果...,作为它的线程池执行异步代码 若指定线程池,则使用自定义或者特别定义的线程池执行异步代码 减少阻塞和轮询 从 Java8 开始引入了 CompletableFuture,它是 Future 的功能增强版

8610

Python多线程阻塞线程线程同步和守护线程实例详解

阻塞调用线程直至线程的join() 方法被调用中止-正常退出或者抛出未处理的异常-或者是可选的超时发生; sAlive(): 返回线程是否活动的 getName(): 返回线程名;setName(...;子线程运行完,主线程可能还在运行 二、多线程线程阻塞,子线程.join()(设置在start之后,等所有阻塞线程运行完,再运行主线程) 1、阻塞线程必须在start()方法后执行,t1.join(...(timeout)此方法有个timeout参数,是线程超时时间设置 4、阻塞线程和非阻塞线程实例 #非阻塞线程,主线程休眠1s,子线程休眠3s 时间未统计到子线程,只统计到主线程的,说明主线程和子线程是同步执行的...-2 Thu Mar 14 13:30:10 2019 Process finished with exit code 0 #阻塞线程1、阻塞线程2,主线程休眠1s,线程1和线程2休眠3s 主线程会等线程...1 thread2.join()#阻塞线程2 time.sleep(1) print('退出主线程%s'%time.ctime()) run_times=(time.time()-start_time)

4.5K40

服务器模型——从单线程阻塞到多线程阻塞(上)

该系列分成三部分: 单线程/多线程阻塞I/O模型 单线程阻塞I/O模型 多线程阻塞I/O模型,Reactor及其改进 前言 这里探讨的服务器模型主要指的是服务器端对I/O的处理模型。...从不同维度可以有不同的分类,这里从I/O的阻塞与非阻塞、I/O处理的单线程与多线程角度探讨服务器模型。 对于I/O,可以分成阻塞I/O与非阻塞I/O两大类型。...阻塞I/O在做I/O读写操作时会使当前线程进入阻塞状态,而非阻塞I/O则不进入阻塞状态。...单线程阻塞I/O模型 单线程阻塞I/O模型是最简单的一种服务器模型,几乎所有程序员在刚开始接触网络编程时都从这个简单的模型开始。...多线程阻塞I/O模型 针对单线程阻塞I/O模型的缺点,我们可以使用多线程对其进行改进,使之能并发地对多个客户端同时进行响应。多线程模型的核心就是利用多线程机制为每个客户端分配一个线程

1.5K50

面试官:都说阻塞 IO 模型将会使线程休眠,为什么 Java 线程状态却是 RUNNABLE?

使用 Java 阻塞 I/O 模型读取数据,将会导致线程阻塞线程将会进入休眠,从而让出 CPU 的执行权,直到数据读取完成。...这个期间如果使用 jstack 查看线程状态,却可以发现Java 线程状态是处于 RUNNABLE,这就和上面说的存在矛盾,为什么会这样?...上面的矛盾其实是混淆了操作系统线程状态与 Java 线程状态。这里说的线程阻塞进入休眠状态,其实是操作系统层面线程实际状态。而我们使用 jstack 查看的线程状态却是 JVM 中的线程状态。...休眠状态,运行状态下的线程如果调用阻塞 API,如阻塞方式读取文件, 线程状态就将变成休眠状态。这种情况下,线程将会让出 CPU 使用权。休眠结束,线程状态将会先变成可运行状态。...其他 Java 线程状态与操作线程状态类似。 面试官:都说阻塞 I/O 模型将会使线程休眠,为什么 Java 线程状态却是 RUNNABLE? ?

1.4K10
领券