import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
/** *//**
* Callable 和 Future接口
* Callable是类似于Runnable的接口,实现Callable接口的类和实现Runnable的类都是可被其它线程执行的任务。
* Callable和Runnable有几点不同:
* (1)Callable规定的方法是call(),而Runnable规定的方法是run().
* (2)Callable的任务执行后可返回值,而Runnable的任务是不能返回值的。
* (3)call()方法可抛出异常,而run()方法是不能抛出异常的。
* (4)运行Callable任务可拿到一个Future对象,
* Future 表示异步计算的结果。它提供了检查计算是否完成的方法,以等待计算的完成,并检索计算的结果。
* 通过Future对象可了解任务执行情况,可取消任务的执行,还可获取任务执行的结果。
*/
public class CallableAndFuture {
/** *//**
* 自定义一个任务类,实现Callable接口
*/
public static class MyCallableClass implements Callable{
// 标志位
private int flag = 0;
public MyCallableClass(int flag){
this.flag = flag;
}
public String call() throws Exception{
if (this.flag == 0){
// 如果flag的值为0,则立即返回
return "flag = 0";
}
if (this.flag == 1){
// 如果flag的值为1,做一个无限循环
try {
while (true) {
System.out.println("looping.");
Thread.sleep(2000);
}
} catch (InterruptedException e) {
System.out.println("Interrupted");
}
return "false";
} else {
// falg不为0或者1,则抛出异常
throw new Exception("Bad flag value!");
}
}
}
public static void main(String[] args) {
// 定义3个Callable类型的任务
MyCallableClass task1 = new MyCallableClass(0);
MyCallableClass task2 = new MyCallableClass(1);
MyCallableClass task3 = new MyCallableClass(2);
// 创建一个执行任务的服务
ExecutorService es = Executors.newFixedThreadPool(3);
try {
// 提交并执行任务,任务启动时返回了一个 Future对象,
// 如果想得到任务执行的结果或者是异常可对这个Future对象进行操作
Future future1 = es.submit(task1);
// 获得第一个任务的结果,如果调用get方法,当前线程会等待任务执行完毕后才往下执行
System.out.println("task1: " + future1.get());
Future future2 = es.submit(task2);
// 等待5秒后,再停止第二个任务。因为第二个任务进行的是无限循环
Thread.sleep(5000);
System.out.println("task2 cancel: " + future2.cancel(true));
// 获取第三个任务的输出,因为执行第三个任务会引起异常
// 所以下面的语句将引起异常的抛出
Future future3 = es.submit(task3);
System.out.println("task3: " + future3.get());
} catch (Exception e){
System.out.println(e.toString());
}
// 停止任务执行服务
es.shutdownNow();
}
}
分享到:
相关推荐
### Java多线程与并发(17-26)-JUC线程池-FutureTask详解 #### 一、概述 本文将围绕Java多线程与并发中的重要概念——`...理解`FutureTask`的工作原理及其使用方法,对于提高程序的并发性能和响应能力具有重要意义。
例如:`callable(len)`返回True,`callable(10)`返回False。 11. `chr(i)`:将整数`i`转换为其对应的Unicode字符。例如:`chr(100)`返回'd'。 12. `classmethod(function)`:装饰器,使方法成为类方法,第一个参数...
9. `callable(obj)`:检查对象是否可调用,即能否像函数一样被调用。如果返回True,意味着可以尝试调用对象;如果返回False,对象不能被调用。 10. `chr(i)`:返回Unicode编码i对应的字符。例如,`chr(100)`返回'd'...
- **意义**:多线程技术能够充分利用多核CPU的并行处理能力,使得程序的不同部分可以在不同的核心上同时执行,从而显著提升程序的整体运行效率。 - **举例**:假设一个应用程序需要处理大量图像数据,通过多线程...
在这种情况下,所有任务都是真正意义上的“同时”运行。 2. **并发**:指的是在同一时刻,只有一个任务在执行,但多个任务通过快速轮换执行,使得在宏观上看像是同时执行的。这通常发生在多线程环境中,其中CPU...
Java等编程语言提供了丰富的API来支持多线程编程,这在处理并发任务、提高系统效率和响应速度等方面具有重要意义。以下是一些关于线程工作和多线程工具的关键知识点: 1. **线程创建**: - `Thread`类:通过继承...
### Java Concurrent处理并发需求 #### 一、Java并发基础与Concurrent API介绍 ...本篇文章通过一个简单的示例介绍了如何使用`ExecutorService`来管理线程池并执行并发任务,这对于提高程序性能和响应性具有重要意义。
根据提供的信息,“JAVA并发编程实践.pdf...掌握Java并发编程的基本原理和技术对于提升系统性能、减少延迟和提高用户体验有着重要意义。希望通过对以上知识点的学习,能够帮助开发者更好地理解和运用Java并发编程技术。
2. **提交任务**:使用`execute(Runnable task)`方法提交Runnable任务,或者使用`submit(Callable<T> task)`提交Callable任务并获取Future结果。 3. **关闭线程池**:任务执行完毕后,应调用`shutdown()`或`shutdown...
- **变量命名规则:** 建议采用有意义的命名方式,便于理解和调试。 - **调用约定:** CPLEX 提供了特定的调用约定,必须遵循以确保正确性。 - **内存管理:** 应注意避免内存泄漏,正确分配和释放内存。 - **错误...
### JAVA线程池应用知识点详解 #### 一、Java线程池概述 线程池是Java多线程编程中的一个重要概念。它通过管理一组多线程的方式,为...掌握线程池的原理及其使用方法,对于提高Java程序的性能和稳定性具有重要意义。
它强调的是微观上的同时性,即真正意义上的多个任务在同一时刻执行。 ### Java并发编程基础 #### 1. 线程基础 线程是程序执行流的最小单元。一个标准的Java应用程序至少有一个线程,即main线程。可以通过以下几种...
4. Runnable和Callable的区别:Runnable没有返回值,Callable可以有返回值并且能抛出异常。 5. 线程的状态包括新建、就绪、运行、阻塞和死亡。 6. sleep()使当前线程休眠,wait()用于等待其他线程的通知;notify()...
在深入探讨 Relay 的功能和使用方法之前,我们先来理解一下中间件的概念以及 PSR-7 的意义。 中间件在 Web 开发中的角色是处理请求和响应的组件,它们可以串行执行,每个中间件都可以对请求进行修改,处理业务逻辑...
9. **Future和Callable接口**:Future表示异步计算的结果,Callable用于定义线程的返回值,配合ExecutorService可以方便地获取线程执行结果。 10. **CountDownLatch、CyclicBarrier、Semaphore等并发工具类**:这些...
单核CPU上的多线程编程意义 - **情景分析**: - 如果是CPU密集型任务,在单核CPU上过多使用线程可能导致频繁的上下文切换,反而降低效率。 - 对于涉及大量I/O操作(如磁盘读写、网络通信等)的任务,即使在单核...
标题中的“21043779_Csharp_OPCClient_RCW_CODE.zip_OPC自定义接口_c# 接口开发_opc csha”表明这是一个...这些知识点对于理解工业自动化系统中的数据交换和控制逻辑具有重要意义,是现代工业软件开发的重要组成部分。
Java实现的Spooling(Simultaneous Peripheral Operations On-Line,联机外围设备操作)是一种将输入输出设备进行缓冲...这对于理解和实践操作系统原理,以及提升Java应用在I/O密集型任务中的性能都具有重要的意义。
Java多线程技术是现代软件开发中不可或缺的一部分,掌握其原理和使用方法对于提高程序性能、简化复杂逻辑具有重要意义。开发者应当深入了解Java多线程的基本概念、创建方式以及常用的线程控制方法,并结合实际应用...
- **Callable与Future**:讲解如何使用Callable接口创建可以返回结果的线程,以及如何使用Future获取这些结果。 - **同步机制**:包括synchronized关键字、ReentrantLock等锁机制,以及如何避免死锁等问题。 - **...