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

JUC系列(六) | Callable和Future接口详解&使用、FutureTask应用 获取异步线程返回值

喜欢封面的云,就是不知道你喜不喜欢 一、Callable 接口 1)前言: 在上上篇文章中,创建线程那个小角落,提到了这个,但是当时只是匆匆忙忙讲了一下。到这里再全面性的讲解一下。...如果只是简单创建线程,直接使用Runnable就可以,想要获得任务返回值,就用Future。...此类提供Future的基本实现,具有启动和取消计算、查询以查看计算是否完成以及检索计算结果的方法。 计算完成后才能检索结果; 如果计算尚未完成, get方法将阻塞。...一旦计算完成,就不能重新开始或取消计算(除非使用runAndReset调用计算)。结构图: FutureTask实现了 Runnable 和 Future接口,并方便地将两种功能组合在一起。...使用放在下一小节啦 四、使用 Callable 和 Future 这里的使用其实在上文已经提到过了,这里就将其更完善一些吧。

1K20

跟面试官刚同步异步编程,有她完全够用了

共享变量,函数参数和返回值三种,更高效的那就 future 和 promise 吧 7,既然你提到了 future 和 promise,你能说说他们是如何工作的吗?并给我写个相关的代码?...有线程1和2,线程1希望从线程2中获取特定值,步骤如下: 线程1:创建promise对象,并从该对象中获得对应的future对象-> ->线程1将promise对象传递给线程...'\n'; } int main () { //提供一个不同线程之间的数据同步机制 他可以存储一个某种类型的值 并将其传递给对应的future 即使这个future不在同一个线程中也可以安全的访问到这个值...\n"; th.join(); return 0; } 再来一个: // 使用promise传递被调用线程返回结果,通过共享状态变化通知调用线程已获得结果 #include ...(sum); // 将结果存入,并让共享状态变为就绪以提醒future } int main() { // 演示用 promise 在线程间传递结果。

56920
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    【Example】C++ 标准库多线程同步及数据共享 (std::future 与 std::promise)

    (类型由模板类型而定) valid() 检查 future 是否处于被使用状态,也就是它被首次在首次调用 get() 或 share() 前。 wait() 阻塞等待调用它的线程到共享值成功返回。...【注:此处应额外补充 alloc 构造函数】 3,std::promise 与 std::future 的状态相关联,它负责将共享值存入并给 std::future 访问使用,值类型也有可能是void、...在这个非常简单的例子当中可以看到通过 promise to future 做到了线程的同步与值的传递,还有异常的处理。...std::shared_future 与 std::packaged_task std::future 有个非常明显的问题,就是只能和一个 std::promise 成对绑定使用,也就意味着仅限于两个线程之间使用...(作为右值传递)的副本调用 f (亦作为右值)的副本。将结果或异常置于关联到该 future 的共享状态,然后才令它就绪。对同一 std::future 的所有后续访问都会立即返回结果。

    1.6K30

    《C++并发编程实战》读书笔记(2):并发操作的同步

    中提供了condition_variable和condition_variable_any,前者只能配合mutex使用,而后者可以与任意符合互斥标准的类型使用,会产生额外开销...---- 4.2.1 从后台任务返回值 并不急需某任务的返回值时,可以用async异步地启动任务,获得一个future对象;对后者调用get会阻塞当前线程,等待future准备完并返回该值。...它具备函数调用操作符,参数取决于上述模板参数,调用时将参数传递给任务函数,通过get_future获取future对象,异步运行得到结果后保存到该对象。...若promise销毁时仍未set_value,则传递异常。 下面是单线程处理多个连接的例子。这里假设传入的数据包含有ID与荷载数据,接收后将ID与promise对应,将相关值设为荷载数据。...,每个线程运行到barrier处就阻塞,直到同组的所有线程都抵达才释放。

    38920

    【Netty】「萌新入门」(四)异步编程模型:利用 Future 和 Promise 提高性能与响应能力

    前言 本篇博文是《从0到1学习 Netty》中入门系列的第四篇博文,主要内容是介绍 Netty 中 Future 与 Promise 的使用,通过使用异步的方式提高程序的性能和响应速度,往期系列文章请访问博主的...Netty 专栏,博文中的所有代码全部收集在博主的 GitHub 仓库中; 为什么要使用异步?...具体来说,使用异步可以将一部分耗时较长的操作(如网络请求或文件读写)放入后台线程中执行,同时不会阻塞主线程,使得主线程可以处理其他任务,从而提高整个应用的吞吐量。...Promise 不仅有 Netty Future 的功能,而且脱离了任务独立存在,只作为两个线程间传递结果的容器; JDK Future jdk Future 是 Java 标准库中提供的异步编程接口...trySuccess(V result):尝试将 Promise 标记为成功状态,并设置结果值。如果 Promise 已经完成或者已经被取消,则返回 false,否则返回 true。

    62630

    C++并发编程 - 同步并发操作

    在 promise 对象构造时可以和一个共享状态(通常是std::future)相关联,并可以在相关联的共享状态(std::future)上保存一个类型为 T 的值。 ...与std::packaged_task差异在于,std::promise可在线程运行时,通过set_value()向阻塞线程传递值。...即A线程通过std::promise::set_value()传递某类型T的值,B线程std::future::get()会解除阻塞,同时获取到A线程传的T类型的值。...```std::promise```还是挺有意思的,可以实现线程间的值传递且无并发问题。原来我们通过全局变量实现线程间通信的方法,还要考虑上锁,以后就可以通过promise来实现了。...std::packaged_task: 将任务函数打包丢到指定线程处理,并返回处理结果。 std::promise: 实现两个线程间的数据传递。

    1.1K40

    C++基础 多线程笔记(二)

    (std::string("from main:"), i); }t1.join();return 0;} 程序运行结果依然是主线程和子线程各自输出1000条信息以及将信息保存到txt文件中,和上篇中...下面的程序通过对队列结构中存取和取出数据,模拟生产和消费。采用加锁机制,保证两个子线程互斥,并且消费者线程使用循环查询机制,不断检查是否有可用数据。...(如果只是简单地通过引用的方式在子线程和主线程间传递结果,需要 额外的加锁 机制!)...()都不用,主程序结束时仍等待子线程 future:理解为提供了一种访问异步操作结果的机制,即需要等待一段时间(线程执行完毕) 主线程才能从 子线程 中拿到结果 额外向async()传递一个参数(std...{ int x; promise p;//主线程中的int变量(“约定型”变量) future f = p.get_future();//该变量值的值约定从“将来”future获得

    53010

    c++11 多线程入门教程(一)

    4.future与promise的使用 在c++11中增加的线程库很方便的让我们去使用线程,但是因为做出了一些改变,我们并不能像往常一样直接使用thread.join()获取线程函数的返回值了,而我们有时候又确实要利用线程函数的返回值...和promise的作用是在不同线程之间传递数据。...假设线程1需要线程2的数据,那么组合使用方式如下:     线程1初始化一个promise对象和一个future对象,promise传递给线程2,相当于线程2对线程1的一个承诺;future相当于一个接受一个承诺...,用来获取未来线程2传递的值     线程2获取到promise后,需要对这个promise传递有关的数据,之后线程1的future就可以获取数据了。    ...std::packaged_task将其包装的可调用对象的执行结果传递给一个std::future对象,与std::promise某种程度上是很像的,promise保存一个共享状态的值,而package_task

    94420

    C++一分钟之-未来与承诺:std::future与std::promise

    本文将深入浅出地介绍这两个概念,探讨它们的应用场景、常见问题、易错点及如何避免,同时辅以代码示例,帮助读者更好地理解和运用这些机制。...1.2 承诺(std::promise)std::promise则是用来设置std::future值的对象。它允许你在某个时刻将结果存储起来,而这个结果可以被关联的future对象获取。...并发编程:在多线程环境中,std::promise和std::future可以用来在不同线程间传递数据,实现线程间的通信。...三、常见问题与易错点3.1 异常安全当向std::promise设置值时抛出异常,如果没有妥善处理,可能会导致结果永远不会被设置,而等待的std::future将永远阻塞。...4.3 确保线程安全使用互斥锁或其他同步原语保护对std::promise的操作,防止数据竞争。

    1K10

    【Netty】「源码解析」(三)设置连接超时:深入分析 ChannelFuture.sync() 的执行过程

    其实是通过 connectPromise 进行传递消息,我们可以在主线程中标记一下 future,如下图所示: 然后切换至 NIO 线程,可以发现 connectPromise 也被标记了,说明他们共属于一个主体...,如下图所示: 如果不是很了解 Future 和 Promise 之间的联系的话,可以阅读博主的另一篇文章:异步编程模型:利用 Future 和 Promise 提高性能与响应能力; 在上述事例中,我们设置了两秒钟的连接超时时间...在 sync() 方法内部,会获取当前线程绑定的 EventLoop 对象,然后将当前任务包装成一个特殊的 Promise 对象。...sync 源码解析 首先使用 super.sync() 调用了父类的 sync() 方法,将当前对象作为结果返回。...await 源码解析 await 方法是一种等待机制的实现,它通过检查承诺是否已完成,处理中断异常以及使用同步块和等待机制来让线程等待承诺的完成。

    72020

    【Netty】「源码解析」(三)设置连接超时:深入分析 ChannelFuture.sync() 的执行过程 | 技术创作特训营第一期

    其实是通过 connectPromise 进行传递消息,我们可以在主线程中标记一下 future,如下图所示: 图片 然后切换至 NIO 线程,可以发现 connectPromise 也被标记了,说明他们共属于一个主体...,如下图所示: 图片 如果不是很了解 Future 和 Promise 之间的联系的话,可以阅读博主的另一篇文章:异步编程模型:利用 Future 和 Promise 提高性能与响应能力; 在上述事例中...在 sync() 方法内部,会获取当前线程绑定的 EventLoop 对象,然后将当前任务包装成一个特殊的 Promise 对象。...sync 源码解析 首先使用 super.sync() 调用了父类的 sync() 方法,将当前对象作为结果返回。...await 源码解析 await 方法是一种等待机制的实现,它通过检查承诺是否已完成,处理中断异常以及使用同步块和等待机制来让线程等待承诺的完成。

    5K37332

    再也不用std::thread编写多线程了

    filter和一个最大值maxVal作为形参 * doWork会校验它做计算的条件全部成立,之后会针对筛选器选出的0到maxVal之间的值进行计算 * * 需要设置实施筛选的那个线程的优先级别,要去使用线程的低级句柄...();//此时我们知道期望对象 fut没有指涉到由 std::async调用产生的共享状态,所以它的析构函数将表现为常规行为 //但是 std::packsgaed_task不能复制,将pt传递给...以等待它的期望,该wait调用会阻塞反应任务到 * std::promise型别对象被设置为止 * * 2,发生端std::promise,接收端 std::future和std::shared_future...std::shared_future副本去指涉到共享状态,所有,从share中获取的std::shared_future被 * 运行在反应线程上的lambda按值捕获 * */ std::promise...4,使用 std:: promise 型别对象和期值就可以回避这些问题,但是一来这个途 径为了共享状态需要使用堆内存,而且仅限于一次性通信 6条款40:对并发使用 std::atomic,对特种内存使用

    2.5K40

    C++并发低级接口:std::thread和std::promise

    这里也凸显了std::async的高级和std::thread的低级:在std::async中我们可以对它的返回值即std::future简单的调用get()实现同步等待甚至能获取任务的结果,但是std...std::promise std::promise独树一帜,它用于线程间传递值,其中std::promise.set_value是设置值,std::promise.set_exception是设置异常,...task线程中p.get_future().get()会阻塞当前线程直到promise已经设置值,即task线程会一直阻塞直到main线程执行 p.set_value(1024);后才继续执行。...多说一点,其实std::promise和std::future都是多线程状态共享的方案,这两种不存在高级低级,只有std::async和std::thread有点高级低级之分。...不过《C++标准库》中这样分类,加之std::future,std::promise分别用于std::async和std::thread的示例,我也只能照做了;)

    2.3K40

    Dart学习 Future 异步 Isolate 隔离

    Dart 中的并发Futrue 如果使用了async 异步亲求,返回的类型一定要是Future类型的。Future 调用类似于 promise ,相当于是微任务。...');  }); print('end');}// 打印结果// start// 22222// end// 111111111// 22222除了可以使用async和awite Future 也可以使用...Future(() { sleep(Duration(seconds: 2)); return '第二个请求';  });}也可以使用async 和 await,将异步代码同步的写出,去掉了.then...类似于Promise.all这里调用上面写过的两个方法,结果是两个返回值组成的数组void main(List args) { Future.wait([req(), req2(23)...([req(), req2(23)]) print(res);}Ioslate 隔离将原本单线程的内容模拟成“多线程”,在主线程中创建新的隔离执行耗时任务,不会阻塞主线程的执行,执行完成后再通过管道将结果输送给主线程

    17320

    libcopp对C++20协程的接入和接口设计

    当时主要是考虑到 Rust也有和C++类似的历史包袱问题,所以参考了一些Rust协程改造过程中的设计。 但是后来尝试在项目中使用的时候发现还是有一些问题。...由发起 co_await 的线程在挂起协程后执行,如果这时候handle被传递到其他线程且被resume了。...可移动,不可复制(仅内部调用) 管理handle生命周期(否则awaitable和promise的释放顺序是UB) 传递失败状态 特殊的callable_future any( callable_future...即,对于 trivally_copyable 且size小的类型,使用 memcpy 来传递 return_value 和外部传入的数据到 co_await 的返回值,否则使用 unique_ptr 来转移数据...(特别是 task_future 和 generator_future 里 awaitable和promise对象之间交互时对 context 的传递,一定是在单线程内的。)

    68520

    c++11新特性之线程相关所有知识点

    都等于p指向的值,一般编译器会对此做优化,把*p的值放入寄存器,就是传说中的工作内存(不是主内存),之后a和b都等于寄存器的值,但是如果中间p地址的值改变,内存上的值改变啦,但a,b还是从寄存器中取的值...::thread高级些,std::future作为异步结果的传输通道,通过get()可以很方便的获取线程函数的返回值,std::promise用来包装一个值,将数据和future绑定起来,而std::packaged_task...三者之间的关系 std::future用于访问异步操作的结果,而std::promise和std::packaged_task在future高一层,它们内部都有一个future,promise包装的是一个值...,packaged_task包装的是一个函数,当需要获取线程中的某个值,可以使用std::promise,当需要获取线程函数返回值,可以使用std::packaged_task。...packaged_task和promise那么麻烦,关于线程操作应该优先使用async,看一段使用代码: #include #include future> #include

    62620
    领券