package com.demo.test4; import java.util.ArrayList; import java.util.List; import java.util.concurrent.Callable; import java.util.concurrent.CancellationException; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; /** * @author QQ: 1236897 如果超过限制时间则取消超时线程 * */ public class InvokeDemo { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub ExecutorService exec = Executors.newCachedThreadPool(); List<SearchTask> searchTasks = new ArrayList<SearchTask>(); SearchTask st = null; for (int i = 0; i < 10; i++) { st = new SearchTask(i, 200);// 指定2001 毫米为最大执行时间 if (i == 5) st = new SearchTask(i, 2001);// 指定2001 毫米为最大执行时间 searchTasks.add(st); } try { // 要求认为在2000毫秒内返回结果,否则取消执行。 List<Future<List<Person>>> futures = exec.invokeAll(searchTasks, 2000, TimeUnit.MILLISECONDS);// invokeAll // 第一个参数是任务列表;第二个参数是过期时间;第三个是过期时间单位 int count = 0; for (Future<List<Person>> future : futures) { try { List<Person> students = future.get(); for (Person student : students) { System.out.println(student.toString()); } } catch (CancellationException e) { System.out.println("cancel"); future.cancel(true); } System.out.println("-----------------------" + count + "--------------------"); count++; } exec.shutdown(); } catch (InterruptedException e) { e.printStackTrace(); Thread.interrupted(); } catch (ExecutionException e) { e.printStackTrace(); } } } /** * @filename: SearchTask * @description: 查询任务 * @author lida * @date 2013-4-1 下午3:02:29 */ class SearchTask implements Callable<List<Person>> { public final int classID; public long sleepTime; /** * <p> * Title: * </p> * <p> * Description: * </p> * * @param classID * 班级编号 * @param sleepTime * 模拟操作所用的时间数(毫秒) */ SearchTask(int classID, long sleepTime) { this.classID = classID; this.sleepTime = sleepTime; } @Override public List<Person> call() throws Exception { // 模拟操作所用的时间数(毫秒) Thread.sleep(sleepTime); List<Person> stuList = new ArrayList<Person>(); Person p = new Person(1, "name", 2); Person p2 = new Person(2, "name", 3); stuList.add(p); stuList.add(p2); return stuList; } } class Person { private int id; private String name; private int classID; public Person(int id, String name, int classID) { this.id = id; this.name = name; this.classID = classID; } public String toString() { return Person.class.getName() + "(id:" + this.id + ",name:" + this.name + ")"; } }
相关推荐
Java多线程结构是Java编程中的重要组成部分,它允许程序同时执行多个任务,提升系统效率。在Java中,实现多线程主要有两种方式:继承Thread类和实现Runnable接口。 1. 继承Thread类: 当自定义类继承Thread类时,...
解决线程的死掉问题和超时问题特别好使,在Java中,如果需要设定代码执行的最长时间,即超时,可以用Java线程池ExecutorService类配合Future接口来实现。 Future接口是Java标准API的一部分,在java.util.concurrent...
### Java多线程编程总结 #### 一、Java线程:概念与原理 - **操作系统中线程和进程的概念** 当前的操作系统通常都是多任务操作系统,多线程是一种实现多任务的方式之一。在操作系统层面,进程指的是内存中运行的...
- **多线程RMI**:RMI支持并发调用,多个客户端可以同时调用同一远程对象的方法。 - **远程接口超时**:可以通过配置RMI客户端的超时设置来控制等待远程方法响应的时间。 - **安全性**:RMI可以通过SSL/TLS加密通信...
Java中的多线程技术是编程中的一个重要领域,它允许程序同时执行多个任务,从而更高效地利用CPU资源。在Java中,多线程主要用于模拟现实世界中的并发行为,例如"生产者-消费者"模型。本文将深入探讨Java多线程的相关...
这对于需要获取多线程计算结果的场景非常有用,可以实现超时控制和任务取消功能。 在并发工具类中,`CyclicBarrier`和`CountDownLatch`常用于协调多个线程。`CyclicBarrier`允许一组线程等待彼此到达某个屏障点后一...
总的来说,Java并发编程实践中的任务执行是一个涉及线程调度、线程池管理、任务生命周期控制、结果处理等多个方面的复杂主题。理解和掌握这些概念和技术,能够帮助开发者编写出更加高效、可靠的并发程序。
Java线程是Java编程语言中的一个关键概念,它允许程序同时执行多个任务,极大地提高了程序的并发性和效率。本文将深入解析Java线程的核心概念、创建方式、生命周期、同步机制以及线程管理策略。 首先,Java线程的...
在IT领域,尤其是在Java编程中,多线程是不可或缺的一部分,它使得程序能够同时执行多个任务,从而提高系统的效率和响应性。今天我们将深入探讨Java中的多线程、时间片调度以及死锁的概念,这些都是Java程序员必备的...
在IT行业中,线程是操作系统的基本执行单元,它允许程序并行执行多个任务。在Windows编程中,Visual C++(VC)提供了丰富的API来创建、操作、同步和管理线程,尤其是在开发多线程应用程序时。下面将详细介绍标题和...
- **使用ExecutorService、Callable、Future**:提供带返回值的多线程解决方案,Callable返回Future对象,用于获取线程执行结果。 4. **start()和run()的区别**: - **start()**启动线程,使得run()方法在独立的...
Java多线程编程是Java开发中的重要组成部分,它允许程序同时执行多个任务,提升系统效率。下面将对Java多线程编程的相关知识点进行详细的总结。 首先,我们需要理解线程的概念和原理。线程是操作系统分配CPU时间的...
Java线程编程是Java开发中的重要组成部分,它允许程序同时执行多个任务,提高了程序的并发性和效率。在Java中,线程是程序执行的基本单元,一个进程可以包含多个线程。下面将详细介绍Java线程编程的一些核心概念和...
多线程是指在一个进程中同时运行多个线程,以提高程序的并发性和效率。然而,多线程编程中经常需要控制线程的执行顺序,确保某些线程完成特定任务后再继续其他线程的工作,这就是线程等待的作用。 API线程等待,...
读写锁模式允许多个线程同时读取数据,但只允许一个线程写入数据,提高了数据访问的并发性。Java的`ReentrantReadWriteLock`类提供了这种功能,通过`readLock()`和`writeLock()`方法获取读锁和写锁。读锁是共享的,...
在Java编程中,线程是程序执行的基本单元,它允许一个程序同时执行多个不同的任务。理解并熟练掌握线程是成为专业Java开发者的关键技能之一。本教程将深入探讨Java线程的核心概念,包括为什么使用线程、创建线程的...
在Java编程中,`Callable`接口是处理多线程问题的一个重要概念,尤其在需要从线程中返回结果的情况下。`Callable`接口与我们熟知的`Runnable`接口相似,但功能更加强大,主要体现在以下几个方面: 1. **方法签名的...
`Runnable`接口不提供返回值,而`Callable`接口则允许线程执行后返回一个结果。在处理异步任务时,我们通常会用到`ExecutorService`,这是一个线程池服务,它可以管理和调度线程执行任务。 当一个线程超时,即在...
在Linux操作系统中,多线程编程是通过POSIX线程库(pthread)来实现的,这个库提供了一套丰富的API,使得开发者可以在单个进程中创建并管理多个执行线程。`pthread`是POSIX标准的一部分,它允许程序员创建轻量级进程...
Java线程是Java编程中非常重要的一个概念,它允许程序同时执行多个任务,从而提高了程序的效率和响应性。在Java中,线程是通过`java.lang.Thread`类或者实现`java.lang.Runnable`接口来创建和管理的。 1. **线程与...