如何在java中获取线程异步执行之后的结果

如何在java中获取线程异步执行之后的结果,第1张

java中提供了Future<V>接口和实现了Future接口的FutureTask<V> 类来将线程执行之后的结果返回(通过get()方法)。

1Future<V>接口

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 javautilconcurrentCallable;

import javautilconcurrentExecutionException;

import javautilconcurrentExecutorService;

import javautilconcurrentExecutors;

import javautilconcurrentFuture;

public class TestFuture {

public static void main(String[] args) throws InterruptedException, ExecutionException {

ExecutorService executor = ExecutorsnewCachedThreadPool();

Future result1 = executorsubmit(new Callable() {

@Override

public Integer call() throws Exception {

int sum = 0;

for (int i = 0; i < 10; i++) {

sum += i;

}

return sum;

}

});

Future result2 = executorsubmit(new Callable() {

@Override

public Integer call() throws Exception {

int sum = 0;

for (int i = 10; i < 100; i++) {

sum += i;

}

return sum;

}

});

executorshutdown();

Systemoutprintln(result1get() + result2get());

}

}

2FutureTask类

FutureTask实现了Future接口,将一个Callable实例作为参数传给它,就能创建一个FutureTask实例,然后用ExecutorService的submit方法来执行这个实例。最后同样是用get方法获取线程执行后的结果。

[plain] view plain copy

import javautilconcurrentCallable;

import javautilconcurrentExecutionException;

import javautilconcurrentExecutorService;

import javautilconcurrentExecutors;

import javautilconcurrentFutureTask;

public class TestFutureTask {

public static void main(String[] args) throws InterruptedException, ExecutionException {

ExecutorService executor = ExecutorsnewCachedThreadPool();

Callable task = new Callable() {

@Override

public String call() throws Exception {

return "结果";

}

};

FutureTask ft = new FutureTask(task);

executorsubmit(ft);

Systemoutprintln(ftget());

executorshutdown();

}

}empty

建立一个类

继承Thread或者Runnable接口就自己看着办了

然后在run方法法里面

while(true)

{

××××××

//写上重画的代码

Threadsleep(1000);

}

大家在学习java编程语言的过程中,对于线程的学习应该是非常重要的一项学习任务了,今天,我们就一起来了解一下,在进行线程处理过程中都有哪些 *** 作方式。北京java培训希望通过对本文的阅读,能够提高大家对线程处理的技术能力。

终止线程(stop)

不推荐使用Threadstop(),他会释放所有的monitor,导致数据不一致

假设有一条数据库记录,有两个字段ID,Name

为了保持同一条记录ID,Name一致,会在读写该对象的时候加锁

线程A获取到锁,开始写 *** 作,写完ID=1,还没写Name,被强制stop了,释放掉了锁

线程B拿到锁,读取对象,以为是线程安全的,实际上数据是错的,只有ID有值,Name为null

中断线程(interrupt)

可以通过调用threadinterrupt()对线程进行中断 *** 作

当线程收到interrupt信号后,可能会有两种场景:

线程处于运行状态:将isinterrupt置为true

线程处于阻塞状态:抛出InterruptedException,isinterrupt为false

挂起(suspend)和继续执行(resume)

@Deprecated不推荐使用,原因是如果在多线程环境中,假设多个线程调用线程A的suspend和resume

如果线程B先调用了threadAsuspend(),线程C再调用threadAresume(),则没问题

如果线程B先调用了threadAresume(),线程C再调用threadAsuspend(),这个时候将导致线程A处于冻结状态,其持有的锁无法释放

等待线程结束(join)和谦让(yield)

yield

可以让当前线程暂停一下,类似于sleep,但是他不会阻塞该线程,只是从运行状态切换为就绪状态

当yeild执行后,优先级大于等于当前线程优先级的所有线程都会有竞争CPU执行的机会,他自身也会参与竞争

以上就是关于如何在java中获取线程异步执行之后的结果全部的内容,包括:如何在java中获取线程异步执行之后的结果、Java中如何实现父线程如何获得子线程数据、北京java培训分享软件开发线程的处理方式等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9280744.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-26
下一篇 2023-04-26

发表评论

登录后才能评论

评论列表(0条)

保存