「java获取线程返回值」java异步线程怎么获取返回值
本篇文章给大家谈谈java获取线程返回值,以及java异步线程怎么获取返回值对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
java 如何创建一个有返回值的线程
可以通过实现Callable接口创建一个有返回值的线程,代码如下:
import java.util.concurrent.*;
public class MyThread implements CallableInteger {
private int count;
public MyThread(int count) {
this.count = count;
}
@Override
public Integer call() throws Exception {
// 此处是线程要处理的业务代码,此处实现的是对count变量加1的操作
count += 1;
Thread.sleep(1000);
return count;
}
public static void main(String[] args) {
// 创建线程实例
MyThread myThread = new MyThread(1);
// 创建一个大小为10的线程池
ExecutorService executor = Executors.newFixedThreadPool(10);
// 将线程提交到线程池执行
FutureInteger future = executor.submit(myThread);
try {
// 调用get方法获取线程执行结果,在线程执行完成前该方法会一直阻塞
Integer result = future.get();
System.out.println(result);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
// try {
// // 这种写法可以设置线程执行的超时时间,当线程超过指定的时间还未执行完成时会抛出TimeoutException异常
// // 示例中表示线程超过1000毫秒还没执行完就会抛出超时异常
// Integer result = future.get(1000, TimeUnit.MILLISECONDS);
// System.out.println(result);
// } catch (InterruptedException e) {
// e.printStackTrace();
// } catch (ExecutionException e) {
// e.printStackTrace();
// } catch (TimeoutException e) {
// e.printStackTrace();
// }
}
}
如何在java中获取线程异步执行之后的结果
java中提供了FutureV接口和实现了Future接口的FutureTaskV 类来将线程执行之后的结果返回(通过get()方法)。
1.FutureV接口
Runnable接口执行任务是不返回任何值的,Runnable的run()方法的执行结果是void,而Future接口的call方法是有返回结果的,这是Runnable跟Future的区别之一,它们的另一个不同之处就是实现了Runnable接口的任务执行是调用ExecutorService的execute(Runnable task)方法,而实现了Future接口的任务是调用ExecutorService的submit(Future task)方法。调用Future的get()方法就能直接得到任务的返回值,该方法会一直阻塞直到任务的结果出来为止,我们可以调用Future的isDone()方法来判断该任务的结果是否准备就绪。
[java] view plain copy
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
public class TestFuture {
public static void main(String[] args) throws InterruptedException, ExecutionException {
ExecutorService executor = Executors.newCachedThreadPool();
Future result1 = executor.submit(new Callable() {
@Override
public Integer call() throws Exception {
int sum = 0;
for (int i = 0; i 10; i++) {
sum += i;
}
return sum;
}
});
Future result2 = executor.submit(new Callable() {
@Override
public Integer call() throws Exception {
int sum = 0;
for (int i = 10; i 100; i++) {
sum += i;
}
return sum;
}
});
executor.shutdown();
System.out.println(result1.get() + result2.get());
}
}
2.FutureTask类
FutureTask实现了Future接口,将一个Callable实例作为参数传给它,就能创建一个FutureTask实例,然后用ExecutorService的submit方法来执行这个实例。最后同样是用get方法获取线程执行后的结果。
[plain] view plain copy
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.FutureTask;
public class TestFutureTask {
public static void main(String[] args) throws InterruptedException, ExecutionException {
ExecutorService executor = Executors.newCachedThreadPool();
Callable task = new Callable() {
@Override
public String call() throws Exception {
return "结果";
}
};
FutureTask ft = new FutureTask(task);
executor.submit(ft);
System.out.println(ft.get());
executor.shutdown();
}
}empty
java 线程中的值如何返回
如果是java5的话,那么Java5新增了Callable接口获得线程的返回值,用法如下
package com.ronniewang;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
public class GetReturnValueFromCallable {
private static final int SLEEP_MILLS = 3000;
private static final int SECOND_MILLS = 1000;
private static int sleepSeconds = SLEEP_MILLS / SECOND_MILLS;
ExecutorService executorService = Executors.newCachedThreadPool();
/**
* 在创建多线程程序的时候,我们常实现Runnable接口,Runnable没有返回值,要想获得返回值,Java5提供了一个新的接口Callable
*/
public static void main(String[] args) {
new GetReturnValueFromCallable().testCallable();
}
private void testCallable() {
/**
* Callable需要实现的是call()方法,而不是run()方法,返回值的类型有Callable的类型参数指定,
* Callable只能由ExecutorService.submit() 执行,正常结束后将返回一个future对象
*/
FutureString future = executorService.submit(new CallableString() {
public String call() throws Exception {
Thread.sleep(SLEEP_MILLS);
return "I from callable";
}
});
while (true) {
/**
* 获得future对象之前可以使用isDone()方法检测future是否完成,完成后可以调用get()方法获得future的值,
* 如果直接调用get()方法,get()方法将阻塞值线程结束
*/
if (future.isDone()) {
try {
System.out.println(future.get());
break;
} catch (InterruptedException e) {
// ignored
} catch (ExecutionException e) {
// ignored
}
}
else {
try {
System.out.println("after " + sleepSeconds-- + " seconds, we will get future");
Thread.sleep(SECOND_MILLS);
} catch (InterruptedException e) {
// ignored
}
}
}
}
}
package com.ronniewang;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
public class GetReturnValueFromCallable {
private static final int SLEEP_MILLS = 3000;
private static final int SECOND_MILLS = 1000;
private static int sleepSeconds = SLEEP_MILLS / SECOND_MILLS;
ExecutorService executorService = Executors.newCachedThreadPool();
/**
* 在创建多线程程序的时候,我们常实现Runnable接口,Runnable没有返回值,要想获得返回值,Java5提供了一个新的接口Callable
*/
public static void main(String[] args) {
new GetReturnValueFromCallable().testCallable();
}
private void testCallable() {
/**
* Callable需要实现的是call()方法,而不是run()方法,返回值的类型有Callable的类型参数指定,
* Callable只能由ExecutorService.submit() 执行,正常结束后将返回一个future对象
*/
FutureString future = executorService.submit(new CallableString() {
public String call() throws Exception {
Thread.sleep(SLEEP_MILLS);
return "I from callable";
}
});
while (true) {
/**
* 获得future对象之前可以使用isDone()方法检测future是否完成,完成后可以调用get()方法获得future的值,
* 如果直接调用get()方法,get()方法将阻塞值线程结束
*/
if (future.isDone()) {
try {
System.out.println(future.get());
break;
} catch (InterruptedException e) {
// ignored
} catch (ExecutionException e) {
// ignored
}
}
else {
try {
System.out.println("after " + sleepSeconds-- + " seconds, we will get future");
Thread.sleep(SECOND_MILLS);
} catch (InterruptedException e) {
// ignored
}
}
}
}
}
输出结果:
after 3 seconds, we will get future
after 2 seconds, we will get future
after 1 seconds, we will get future
I from callable
java获取线程返回值的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于java异步线程怎么获取返回值、java获取线程返回值的信息别忘了在本站进行查找喔。
发布于:2022-12-16,除非注明,否则均为
原创文章,转载请注明出处。