详见: http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt125
毫无疑问 Runnable会进行异步执行,此处不多数,主要说明Callable的使用,看实例:
1、
public class ThreadTest {
public static void main(String[] args) throws InterruptedException, ExecutionException {
ExecutorService executor = Executors.newFixedThreadPool(4);
MyTread m1 = new MyTread();
Future f = executor.submit(m1);
// System.out.println(f.get());
executor.shutdown();
System.out.println("akb");
}
}
class MyTread implements Callable<String> {
@Override
public String call() {
try {
System.out.println("线程调度:" + Thread.currentThread());
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "123";
}
}
此程序虽然获取了call方法的返回值,但是没有做处理,所以主线程main和m1同时执行,执行结果如下:
主线程执行完了
线程调度:Thread[pool-1-thread-1,5,main]
2、
public class ThreadTest {
public static void main(String[] args) throws InterruptedException, ExecutionException {
ExecutorService executor = Executors.newFixedThreadPool(4);
MyTread m1 = new MyTread();
Future f = executor.submit(m1);
System.out.println(f.get()); // 进行了输出
executor.shutdown();
System.out.println("主线程执行完了");
}
}
class MyTread implements Callable<String> {
@Override
public String call() {
try {
System.out.println("线程调度:" + Thread.currentThread());
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "123";
}
}
在2中,对m1中call方法的返回值在main中进行了处理(输出),所以在此种情况下,main需要等待m1执行完,再继续执行,执行结果如下
线程调度:Thread[pool-1-thread-1,5,main]
123
主线程执行完了
3、再看当主线程中同时启动两个由Callable生成的线程时
public class ThreadTest {
public static void main(String[] args) throws InterruptedException, ExecutionException {
ExecutorService executor = Executors.newFixedThreadPool(4);
MyTread m1 = new MyTread();
MyTread2 m2 = new MyTread2();
Long time1 = TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis());
Future f = executor.submit(m1);
Future f2 = executor.submit(m2);
System.out.println(f.get()); // 进行了输出m1
System.out.println(f2.get()); // 进行了输出m2
executor.shutdown();
System.out.println("主线程执行完了");
Long time2 = TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis());
System.out.println("主线程等待了" + (time2 - time1) + "秒");
}
}
class MyTread implements Callable<String> {
@Override
public String call() {
try {
System.out.println("线程调度:" + Thread.currentThread());
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "123";
}
}
class MyTread2 implements Callable<String> {
@Override
public String call() {
try {
System.out.println("线程调度2:" + Thread.currentThread());
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "abc";
}
}
当不对m1和m2做输出时,main和m1、m2并发执行,当对m1和m2中任意一个的返回值进行处理的时候,main需要等待,但是m1和m2之前仍然是并发执行,执行结果如下:
线程调度2:Thread[pool-1-thread-2,5,main]
线程调度:Thread[pool-1-thread-1,5,main]
123
abc
主线程执行完了
主线程等待了3秒
相关推荐
主要介绍了Java多线程Callable和Future接口区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
Runnable是执行工作的独立任务,但是它不返回任何值,如果你希望任务在完成时能够返回一个值,那么可以实现Callable接口而不是Runnable接口。在Java SE5中引入的Callable是一种具有类型参数的泛型,它的类型参数表示...
主要介绍了Java使用Callable和Future创建线程操作,结合实例形式分析了java使用Callable接口和Future类创建线程的相关操作技巧与注意事项,需要的朋友可以参考下
callable用法
本文给大家分享的是使用Java多线程来实现callable接口的方法,以及使用方法,另外还有一个网友的实例,希望能够对大家掌握Java多线程有所帮助。
java并发包之Callable和Future java并发包之Callable和Future java并发包之Callable和Future java并发包之Callable和Future java并发包之Callable和Future java并发包之Callable和Future
相信大家对Java编程中如何创建线程已经不陌生了,这篇文章就向朋友们介绍实现callable接口,具体实例详见正文。
java 多线程编程 很实用 来自网上 1)包括新api介绍 2)新线程接口 Callable 和 Future 的讲解 3)线程同步知识
JAVA中Callable的使用。下载后评论可返分
主要介绍了Java多线程之Callable接口的实现,Callable和Runnbale一样代表着任务,区别在于Callable有返回值并且可以抛出异常。感兴趣的小伙伴们可以参考一下
主要介绍了Java多线程下的其他组件之CyclicBarrier、Callable、Future和FutureTask详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
看完《think in java》多线程章节,自己写的多线程文档,还结合了其他的相关网络资料。 线程 一. 线程池 1)为什么要使用线程池 2 2)一个具有线程池的工作队列 3 3)使用线程池的风险: 4 4)有效使用线程池的原则 5...
JAVA多线程实现方式主要有三种:继承Thread类、实现Runnable接口、使用ExecutorService、Callable、Future实现有返回结果的多线程。其中前两种方式线程执行完后都没有返回值,只有最后一种是带返回值的。今天我们...
文章目录1、进程与线程2、创建多线程2.1、继承Thread类2.2、实现Runnable接口2.3、使用匿名内部类实现2.4、实现Runnable接口的好处2.5、使用Callable和Future创建线程3、线程的生命周期4、几种特殊线程4.1、join线程...
1. 什么是线程? 2. 什么是线程安全和线程不安全? 3. 什么是⾃旋锁? 4. 什么是CAS? 5. 什么是乐观锁和悲观锁? 6. 什么是AQS?...在Java Concurrency API中有哪些原⼦类(atomic classes)...10. 什么是Callable和Future?
通过Callable和Future接口创建线程三、Java内存模型概念四、内存间的交互操作五、volatile和synchronized的区别 写在前面:提起多线程大部门同学可能都会皱起眉头不知道多线程到底是什么、什么时候可以用到、用的...
主要介绍了Java 线程(Thread,Runnable,Callable)实例详解的相关资料,这里对java 线程的三种方法进行了对比,需要的朋友可以参考下
主要介绍了详解Java Callable接口实现多线程的方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
计算机后端-Java-Java核心基础-第20章 多线程 18. 创建多线程的方式三:实现Callable接