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培训分享软件开发线程的处理方式等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)