如何得到线程执行完之后返回的结果

本文介绍三种方法实现在Java中将子线程执行的结果同步到主线程:使用反射原理、Callable与ScheduledThreadPoolExecutor结合及自定义接口。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在实际开发过程中,很多时候要将子线程执行完后返回的结果给到主线程里。具体怎么实现呢?这里给出3个实现方法!

1、根据反射原理实现
很多人都习惯在调用线程的时候,通过构造方法给线程传递参数,这里我们在构造方法里传两个参数,一个是类 callback,一个是方法名 method。这样我们在线程的run方法最后 执行callback.getMethod(method).invoke(null); 这样就可能执行你指定的某个类下的某个方法了!

2、Callable+ScheduledThreadPoolExecutor实现
这个是在Java1.5以后,添加了ScheduledThreadPoolExecutor和callable两个组件(接口),ScheduledThreadPoolExecutor大家可能比较熟悉,它的优点就不说了;它用来执行线程进行调度的时候,有一个方法.schedule(Callable<Object> callable, long delay, TimeUnit unit),注意:这里的参数是Callable而不是Runnable,大家千万不要被它唬住了,其实它和Runnable差不多,都能实现有个线程,只不过Callable可以添加返回值!这正是我们想要的!

所以我们在用ScheduledThreadPoolExecutor调度线程得到返回值 ScheduledFuture后执行get()方法,就可以得到返回值了。

 

3、第三种就是自定义接口,把接口当初参数传进线程里,然后在线程完成的地方调用接口的方法,这个方法也是最常用的

 

 

 

 

 

 

### C# 启动线程并等待其成 为了实现启动一个新线程并在主线程中等待这个子线程结束,同时获得它的返回结果,在现代C#编程实践中推荐使用`Task<T>`类来代替传统的Thread类。这不仅简化了异步操作的编写方式还提供了更好的性能和资源管理。 通过`Task.Run()`静态方法可以轻松创建由后台线程支持的任务[^2]: ```csharp var task = Task.Run(() => { // 这里放置耗时的操作逻辑 Thread.Sleep(1000); // 模拟长时间运行的工作 return "Operation Completed"; // 返回结果 }); ``` 要等待上述任务成后取得结果,可以直接访问`task.Result`属性;然而需要注意这样做可能会引发死锁问题特别是在GUI应用程序环境中由于同步上下文的存在[^3]。更安全的做法是利用`await`关键字配合`async/await`模式处理这种情况: ```csharp public async Task<string> PerformLongRunningOperationAsync() { var result = await Task.Run(() => { // 执行一些需要较长时间才能成的工作... Thread.Sleep(1000); return "Completed!"; }); return result; } ``` 对于那些确实希望避免任何潜在的上下文捕获影响(比如在某些特定的服务端场景下),可以在每次遇到`await`表达式的时候显式调用`.ConfigureAwait(false)`以指示编译器不要试图恢复之前的执行环境[^4]: ```csharp public async Task<string> PerformNonCapturingOperationAsync() { string result = await Task.Run(async () => { await Task.Delay(1000).ConfigureAwait(false); return "Done without capturing context"; }).ConfigureAwait(false); return result; } ``` 尽管如此,只在首次`await`处应用`ConfigureAwait(false)`通常也是足够的,除非有特别的理由相信之后的部分也需要同样的行为。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值