文档章节

Thread、Runnable、Callable、Future、FutureTask

俺木加加
 俺木加加
发布于 2016/08/17 11:20
字数 498
阅读 24
收藏 0

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

Thread、Runnable 实现的是void run()方法,Callable实现的是 V call()方法,并且可以返回执行结果,其中Runnable可以提交给Thread来包装下,直接启动一个线程来执行,而Callable则一般都是提交给ExecuteService来执行。

Future就是对于具体的调度任务的执行结果进行查看,最为关键的是Future可以检查对应的任务是否已经完成,也可以阻塞在get方法上一直等待任务返回结果。Runnable和Callable的差别就是Runnable是没有结果可以返回的.

FutureTask则是一个RunnableFuture<V>,即实现了Runnbale又实现了Futrue<V>这两个接口,另外它还可以包装Runnable和Callable<V>,所以一般来讲是一个综合体了,它可以通过Thread包装来直接执行,也可以提交给ExecuteService来执行,并且还可以通过v get()返回执行结果,在线程体没有执行完成的时候,主线程一直阻塞等待,执行完则直接返回结果。

package test;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.FutureTask;

/**
 * 测试Thread ,Runnable,Callable <br>
 * FutureTask 实现了RunnableFuture<V>,是个综合体。<br>
 * 以上所有多线程操作都会出现线程安全问题,需要特别处理。
 * 
 * @author Yuanqy
 *
 */
public class TestThread {

	public static void main(String[] args) {
		try {
			MyThread1 t1 = new MyThread1();// Thread
			MyThread2 t2 = new MyThread2();// Runnable
			MyThread3 t3 = new MyThread3();// Callable ==>Future
			MyThread3 tft = new MyThread3();// Callable ==>FutureTask

			ExecutorService es = Executors.newFixedThreadPool(100);
			for (int i = 0; i < 2; i++) {
				es.execute(t1);
				es.execute(t2);

				Future f1 = es.submit(t3);
				System.err.println("Future:" + f1.get());// get是阻塞的

				FutureTask ft = new FutureTask<Integer>(tft);// 使得Callable能用Runnable驱动
				es.execute(ft);
				System.err.println("FutureTask:" + ft.get());// get是阻塞的
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	static class MyThread1 extends Thread {
		private int ticket = 0;

		public void run() {
			for (int i = 0; i < 10; i++) {
				System.out.println("[Thread]" + Thread.currentThread().getName() + ":" + (++ticket));
			}
		}
	}

	static class MyThread2 implements Runnable {
		private int ticket = 0;

		public void run() {
			for (int i = 0; i < 10; i++) {
				System.out.println("[Runnable]" + Thread.currentThread().getName() + ":" + (++ticket));
			}
		}
	}

	static class MyThread3 implements Callable<Integer> {
		private int ticket = 0;

		@Override
		public Integer call() throws Exception {
			for (int i = 0; i < 10; i++) {
				System.out.println("[Callable]" + Thread.currentThread().getName() + ":" + (++ticket));
			}
			return new Integer(ticket);// 有返回值
		}
	}
}

© 著作权归作者所有

俺木加加

俺木加加

粉丝 29
博文 14
码字总数 23400
作品 1
宜昌
市场营销/销售
私信 提问
Callable、Future和FutureTask

创建线程的2种方式,一种是直接继承Thread,另外一种就是实现Runnable接口。这2种方式都有一个缺陷就是:在执行完任务之后无法获取执行结果。 CountDownLatch用法 先说一下java.lang.Runnabl...

datacube
2016/06/30
63
0
Thread,Runnable,Callable. 多线程

编写多线程程序是为了实现多任务的并发执行,从而能够更好地与用户交互。一般有三种方法,Thread,Runnable,Callable.   Runnable和Callable的区别是,   (1)Callable规定的方法是call(...

千惊万喜
2016/06/30
18
0
java多线程实现方法

编写多线程程序是为了实现多任务的并发执行,从而能够更好地与用户交互。一般有三种方法,Thread,Runnable,Callable. Runnable和Callable的区别是, (1)Callable规定的方法是call(),Runnable...

张欢19933
2016/02/23
48
0
java源码之Runnable、Callable和Future

在java并发编程中,几乎都会用到Runnable、Callable、Future和FutureTask等类或接口,所以理解它们的概念和关系,对设计并发业务和源码阅读会有很大帮助。 1 Runnable Runnable接口应该是被最...

newtrek
06/21
0
0
Callable,Runnable比较及用法以及创建线程的4种方法

编写多线程程序是为了实现多任务的并发执行,从而能够更好地与用户交互。一般有三种方法,Thread,Runnable,Callable. Runnable和Callable的区别是, (1)Callable规定的方法是call(),Runnable...

geek_loser
2017/10/25
17
0

没有更多内容

加载失败,请刷新页面

加载更多

是否有内置功能可以打印对象的所有当前属性和值?

所以我在这里寻找的是类似PHP的print_r函数。 这样一来,我可以通过查看问题对象的状态来调试脚本。 #1楼 可能值得一看- 是否有与Perl的Data :: Dumper等效的Python? 我的建议是 https://gi...

技术盛宴
17分钟前
5
0
直击面试,聊聊 GC 机制

前言 文章来源:https://studyidea.cn/ GC 中文直译垃圾回收,是一种回收内存空间避免内存泄漏的机制。当 JVM 内存紧张,通过执行 GC 有效回收内存,转而分配给新对象从而实现内存的再利用。 ...

程序通事
20分钟前
4
0
Mybatis where 1=1 和 标签

在mybatis中拼接查询语句,偶尔会出现where后面可能一个字段的值都没有,就导致所有条件无效,导致where没有存在的意义;但也有可能这些条件会存在。那解决这个问题的方法,最常见的就是: ...

观海562
22分钟前
4
0
git常用初始化设置

日志编辑工具 git config --global core.editor vim ssh访问 cd /home/weiguangyue/.sshssh-keygen -t rsa -C weiyue888999@126.com 提交者信息用户名 git config --global user.nam......

萧默
23分钟前
4
0
面试题-关于Java线程池一篇文章就够了

在Java面试中,线程池相关知识,虽不能说是必问提,但出现的频次也是非常高的。同时又鉴于公众号“程序新视界”的读者后台留言让写一篇关于Java线程池的文章,于是就有本篇内容,本篇将基于J...

程序新视界
27分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部