========转载=========
在Java 线程中返回值的用法
博客分类: Java
Javathread
有时在执行线程中需要在线程中返回一个值;常规中我们会用Runnable接口和Thread类设置一个变量;在run()中改变变量的值,再用一个get方法取得该值,但是run何时完成是未知的;我们需要一定的机制来保证。
在在Java se5有个Callable接口;我们可以用该接口来完成该功能;
代码如:
Java代码
package com.threads.test;
import java.util.concurrent.Callable;
public class CallableThread implements Callable<String> {
private String str;
private int count=10;
public CallableThread(String str){
this.str=str;
}
//需要实现Callable的Call方法
public String call() throws Exception {
for(int i=0;i<this.count;i++){
System.out.println(this.str+" "+i);
}
return this.str;
}
}
在call方法中执行在run()方法中一样的任务,不同的是call()有返回值。
call的返回类型应该和Callable<T>的泛型类型一致。
测试代码如下:
Java代码
package com.threads.test;
import java.util.ArrayList;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
public class CallableTest {
public static void main(String[] args) {
ExecutorService exs=Executors.newCachedThreadPool();
ArrayList<Future<String>> al=new ArrayList<Future<String>>();
for(int i=0;i<10;i++){
al.add(exs.submit(new CallableThread("String "+i)));
}
for(Future<String> fs:al){
try {
System.out.println(fs.get());
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
}
}
submit()方法返回一个Futrue对象,可以通过调用该对象的get方法取得返回值。
通过该方法就能很好的处理线程中返回值的问题。
如果希望调用的线程不但能执行指定的任务,还想有返回值,这时我们就可以使用Callable与Future接口来实现。至于它的方法可以去查找相关API。下面来看一个例子:
package wyf.jc;
import java.util.concurrent.*;
//实现了Callable接口的任务类
class MyCallableImpl implements Callable{
String taskName;
public MyCallableImpl(String taskName){
this.taskName=taskName;
}
//存放任务代码的run
public Object call(){
System.out.println(taskName+"任务成功执行!");
return "恭喜你,任务成功执行,我是返回消息";
}
}
public class sample17_6 {
/**
* @param args
*/
public static void main(String[] args) {
//创建线程
ExecutorService threadPool=Executors.newSingleThreadExecutor();
//调用线程池的submit方法执行任务
Future future=threadPool.submit(new MyCallableImpl("taskA"));
try{
//调用阻塞方法get获取任务的返回值
System.out.println(future.get());
}catch(Exception ex){
ex.printStackTrace();
}
threadPool.shutdown();
}
}
运行结果如下:
taskA任务成功执行!
恭喜你,任务成功执行,我是返回消息
分享到:
相关推荐
大家都知道实现多线程的2种方式,今天来讲讲Future实现具有返回值的线程。应用场景:前端调用时无需等待线程结束返回,线程结束后需进行其它操作如更新状态、通知kafuka等。
然而,Python的`threading`模块本身并不直接支持获取线程函数的返回值,这需要我们通过一些额外的方式来实现。以下将详细解释如何在Python中使用`threading`获取线程函数的返回值。 首先,我们需要理解`threading`...
大家都知道Runnable和Callable接口都可以作为其他线程执行的任务,但是Runnable接口的run方法没有返回值,而Callable接口的call方法有返回值,那么Callable接口是如何做到的呢?在此我给出一个Demo,看看通过...
- 线程有多种状态,包括新建、可运行、运行、等待、暂停、终止等。 - 可以使用`GetThreadContext()`,`GetThreadTimes()`,或`QueryThreadCycleTime()`等API查询线程状态。 4. **线程同步**: - 为了确保线程...
在编程领域,线程是程序执行的一个独立路径,它允许程序同时执行多个任务。在易语言这样的编程环境中,处理线程并返回数据是一项常见的需求。本文将深入探讨易语言中线程返回数据的方法,帮助开发者更好地理解和应用...
线程有新建(NEW)、可运行(RUNNABLE)、运行(RUNNING)、阻塞(BLOCKED)、等待(WAITING)和终止(TERMINATED)六种状态。当start()方法被调用后,线程进入可运行状态,等待JVM调度进入运行状态。run()方法执行...
C++多线程获取返回值方法详解 在C++多线程编程中,获取线程返回值是一个很重要的 topic。在C++11标准中,std::thread对象会忽略顶层函数的返回值,这就使得获取线程返回值变得困难。下面我们将详细介绍两种获取...
NULL 博文链接:https://icgemu.iteye.com/blog/467848
与 BeginInvoke 对应 有个 EndInvoke 方法, EndInvoke 方法可以收集线程函数的返回值。例如,MyDelegate dele = new MyDelegate (MyFunction); IAsyncResult ref = dele.BeginInvoke(10,"abcd"); ... int result = ...
在许多时候,我们会有这样的需求——即我们想要得到线程返回的值。 但是在C++11 多线程中我们注意到,std::thread对象会忽略顶层函数的返回值。 那问题来了,我们要怎么获得线程的返回值呢? 我们通过一个例子来说明...
在编程领域,线程是程序执行的独立路径,可以并发执行任务,提高程序的效率。在易语言中,创建和管理线程是一项重要的技能。本文将深入探讨如何在易语言中实现线程返回数据的方法,以及相关的源码解析。 易语言是一...
最近有个需求,用多线程比较合适,但是我需要每个线程的返回值,这就需要我在threading.Thread的基础上进行封装 import threading class MyThread(threading.Thread): def __init__(self,func,args=()): super...
`get_result`方法用于获取线程的返回值,如果线程已经执行且有结果,就返回`result`;否则,返回`None`。 接下来,我们看如何使用这个自定义的`MyThread`类来创建和管理线程。假设有一个`threadItem`函数,它会发送...
通过这种方式,我们可以在线程执行后获取到一个返回值,解决了`run()`方法没有返回值的问题。这种方法适用于那些需要在主线程中等待子线程完成并获取其结果的场景,例如计算密集型任务或网络请求等。
在标题和描述中提到的“QT+moveToThread线程+connect信号槽+信号返回值”是QT编程中的关键概念,下面将详细解释这些知识点。 首先,我们来探讨`moveToThread`。在多线程编程中,`QObject`的一个重要特性是它可以...
1. **Joinable状态**:线程默认创建时即处于joinable状态,意味着线程一旦完成执行,它的资源并不会自动释放,需要其他线程(通常是主线程)调用pthread_join()函数等待该线程的结束,并获取其返回值。这样做的好处...
常见的标志有`CREATE_SUSPENDED`,用于创建一个暂停状态的新线程。 - `lpThreadId`: 指向一个变量的指针,用于接收新创建线程的标识符。 #### 二、线程终止方法 线程的终止可以采用多种方式,下面详细介绍几种...
1. 创建Callable接口的实现类,并实现call()方法,该call()方法将作为该线程的执行体,且该call()方法有返回值,再创建Callable的实例。从Java 8开始,可以直接使用Lamda表达式创建Callable对象。 2. 使用...
返回值是一个`std::future`对象,该对象可以用来获取异步任务的结果。当异步任务完成后,`std::future`可以通过`get()`方法获取结果,或者通过`valid()`检查任务是否已完成。如果任务尚未完成,调用`get()`会阻塞...