详见: 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接口的使用场景非常广泛,如计算复杂的数学问题、处理大规模数据、实现高性能的服务器等等。在这些场景中,我们可以使用Callable和Future接口来实现异步计算,从而提高系统的性能和可扩展...
Java使用Callable和Future创建线程操作示例主要介绍了Java使用Callable和Future创建线程操作,结合实例形式分析了java使用Callable接口和Future类创建线程的相关操作技巧与注意事项。 首先,Java 5开始,Java提供了...
### Java Callable与多线程详解 在Java编程中,`Callable`接口是处理多线程问题的一个重要概念,尤其在需要从线程中返回结果的情况下。`Callable`接口与我们熟知的`Runnable`接口相似,但功能更加强大,主要体现在...
以上是对"Java多线程详解"主题的详细阐述,涵盖了Java多线程的基本概念、实现方式、线程控制、线程池、并发集合、线程间通信以及并发编程中常见的问题和解决方案。学习和熟练掌握这些内容对于开发高效的多线程Java...
Runnable是执行工作的独立任务,但是它不返回任何值,如果你希望任务在完成时能够返回一个值,那么可以实现Callable接口而不是Runnable接口。在Java SE5中引入的Callable是一种具有类型参数的泛型,它的类型参数表示...
Java 多线程该存储库包含 ...Java 多线程低级生产者-消费者10- Java 多线程可重入锁11- Java 多线程死锁12- Java 多线程信号量13- Java 多线程Callable 和 Future14- Java 多线程中断线程贡献者Z. Berkay Celik@IOAyman
这本书旨在帮助Java开发者深入理解和熟练掌握多线程编程技术,提升软件开发的效率和质量。在Java平台中,多线程是并发处理的基础,对于构建高效、可扩展的系统至关重要。 Java多线程允许程序同时执行多个独立的代码...
Java多线程详解 在Java编程中,多线程是一种重要的技术,它使得程序能够同时执行多个任务,提高系统的效率和响应性。本教程将详细讲解Java中的多线程概念,包括线程的创建、状态、同步以及高级主题,旨在帮助初学者...
使用场景及目标:① 掌握线程的基本概念和多线程编程的重要知识点;② 学习多种创建线程的方法及其优缺点;③ 理解和应用线程同步与互斥的技术;④ 掌握线程间通信的有效手段,提高程序的并发性和性能。 其他说明:...
然而,为了更好地管理和控制线程,Java并发包提供了如`ExecutorService`、`Future`、`Callable`等高级接口和类,它们简化了多线程编程,并提供了更好的资源管理。 在处理数据库数据时,我们通常会使用JDBC(Java ...
此外,需要注意的是,多线程环境下可能存在竞态条件、死锁等问题,需要合理使用`synchronized`关键字或`Lock`接口来保证数据的一致性和安全性。另外,适当的错误处理和日志记录也是必不可少的,以确保程序的健壮性。...
Java中控制线程的方法有多种,如start()启动线程,run()执行线程,sleep()让线程休眠,join()等待其他线程完成,yield()让当前线程暂停,让其他线程有机会执行,以及interrupt()和isInterrupted()用于中断和检查线程...
Java多线程是Java编程中的重要概念,尤其在开发高性能、高并发的应用中不可或缺。本示例旨在为初学者提供一个全面理解Java多线程的起点。通过学习这个实例,你可以掌握如何创建和管理线程,理解线程同步与通信的重要...
Java 多线程 Callable 接口实现代码示例 Java 多线程编程中,创建线程有多种方式,其中一种便是实现 Callable 接口。Callable 接口是一个函数式接口,定义了一个 call 方法,该方法可以抛出异常并返回结果。与 ...
Java多线程是Java编程中的一个核心概念,它允许程序同时执行多个独立的任务,从而提高应用程序的效率和响应性。在Java中,多线程主要通过两种方式实现:继承Thread类和实现Runnable接口。这份"JAVA多线程的PPT和示例...
Java多线程设计模式是Java开发中的重要领域,它涉及到如何在并发环境下高效、安全地管理资源和控制程序执行流程。本资料集包含了清晰完整的PDF版书籍和源代码,为学习和理解Java多线程设计模式提供了丰富的素材。 ...
在Java编程中,控制程序执行超时是一项重要的任务,特别是在多线程环境下,我们可能需要确保某个任务不会无限制地运行下去,导致资源耗尽。本文将深入探讨如何使用Java的线程机制来实现程序执行的超时控制,同时也会...
Java多线程设计模式是Java编程中不可或缺的一部分,它涉及到如何在并发环境下高效、安全地组织代码...阅读提供的"java多线程设计模式详解.pdf"和"Java多线程设计模式源码"文件,将能更深入地理解这些模式的实际运用。
本资源“java多线程设计模式详解”涵盖了这一主题的深入探讨,包括PDF文档和源码示例。 多线程设计模式是程序员在开发高效、稳定且可维护的多线程应用程序时遵循的一系列最佳实践。以下是一些常见的Java多线程设计...