`
m635674608
  • 浏览: 5028487 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

Java_InvokeAll_又返回值_多个线程同时执行,取消超时线程

    博客分类:
  • java
 
阅读更多

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多线程结构是Java编程中的重要组成部分,它允许程序同时执行多个任务,提升系统效率。在Java中,实现多线程主要有两种方式:继承Thread类和实现Runnable接口。 1. 继承Thread类: 当自定义类继承Thread类时,...

    线程超时死掉

    解决线程的死掉问题和超时问题特别好使,在Java中,如果需要设定代码执行的最长时间,即超时,可以用Java线程池ExecutorService类配合Future接口来实现。 Future接口是Java标准API的一部分,在java.util.concurrent...

    java多线程编程总结

    ### Java多线程编程总结 #### 一、Java线程:概念与原理 - **操作系统中线程和进程的概念** 当前的操作系统通常都是多任务操作系统,多线程是一种实现多任务的方式之一。在操作系统层面,进程指的是内存中运行的...

    java_rmi.rar_RMI java_java.rmi

    - **多线程RMI**:RMI支持并发调用,多个客户端可以同时调用同一远程对象的方法。 - **远程接口超时**:可以通过配置RMI客户端的超时设置来控制等待远程方法响应的时间。 - **安全性**:RMI可以通过SSL/TLS加密通信...

    java多线程解析

    Java中的多线程技术是编程中的一个重要领域,它允许程序同时执行多个任务,从而更高效地利用CPU资源。在Java中,多线程主要用于模拟现实世界中的并发行为,例如"生产者-消费者"模型。本文将深入探讨Java多线程的相关...

    Java多线程问题总结.doc

    这对于需要获取多线程计算结果的场景非常有用,可以实现超时控制和任务取消功能。 在并发工具类中,`CyclicBarrier`和`CountDownLatch`常用于协调多个线程。`CyclicBarrier`允许一组线程等待彼此到达某个屏障点后一...

    JAVA并发编程实践-线程执行-学习笔记

    总的来说,Java并发编程实践中的任务执行是一个涉及线程调度、线程池管理、任务生命周期控制、结果处理等多个方面的复杂主题。理解和掌握这些概念和技术,能够帮助开发者编写出更加高效、可靠的并发程序。

    java线程知识详解

    Java线程是Java编程语言中的一个关键概念,它允许程序同时执行多个任务,极大地提高了程序的并发性和效率。本文将深入解析Java线程的核心概念、创建方式、生命周期、同步机制以及线程管理策略。 首先,Java线程的...

    【IT十八掌徐培成】Java基础第09天-01.多线程-时间片-死锁演示.zip

    在IT领域,尤其是在Java编程中,多线程是不可或缺的一部分,它使得程序能够同时执行多个任务,从而提高系统的效率和响应性。今天我们将深入探讨Java中的多线程、时间片调度以及死锁的概念,这些都是Java程序员必备的...

    VC 线程 创建 操作 同步 终止 UI线程等各种线程例子

    在IT行业中,线程是操作系统的基本执行单元,它允许程序并行执行多个任务。在Windows编程中,Visual C++(VC)提供了丰富的API来创建、操作、同步和管理线程,尤其是在开发多线程应用程序时。下面将详细介绍标题和...

    JAVA多线程面试59题(含答案)_.pdf

    - **使用ExecutorService、Callable、Future**:提供带返回值的多线程解决方案,Callable返回Future对象,用于获取线程执行结果。 4. **start()和run()的区别**: - **start()**启动线程,使得run()方法在独立的...

    Java多线程编程总结.pdf

    Java多线程编程是Java开发中的重要组成部分,它允许程序同时执行多个任务,提升系统效率。下面将对Java多线程编程的相关知识点进行详细的总结。 首先,我们需要理解线程的概念和原理。线程是操作系统分配CPU时间的...

    java关于线程编程

    Java线程编程是Java开发中的重要组成部分,它允许程序同时执行多个任务,提高了程序的并发性和效率。在Java中,线程是程序执行的基本单元,一个进程可以包含多个线程。下面将详细介绍Java线程编程的一些核心概念和...

    易语言 API线程等待

    多线程是指在一个进程中同时运行多个线程,以提高程序的并发性和效率。然而,多线程编程中经常需要控制线程的执行顺序,确保某些线程完成特定任务后再继续其他线程的工作,这就是线程等待的作用。 API线程等待,...

    java多线程高级设计模式详解

    读写锁模式允许多个线程同时读取数据,但只允许一个线程写入数据,提高了数据访问的并发性。Java的`ReentrantReadWriteLock`类提供了这种功能,通过`readLock()`和`writeLock()`方法获取读锁和写锁。读锁是共享的,...

    Java线程完全教程

    在Java编程中,线程是程序执行的基本单元,它允许一个程序同时执行多个不同的任务。理解并熟练掌握线程是成为专业Java开发者的关键技能之一。本教程将深入探讨Java线程的核心概念,包括为什么使用线程、创建线程的...

    java callable(多线程)

    在Java编程中,`Callable`接口是处理多线程问题的一个重要概念,尤其在需要从线程中返回结果的情况下。`Callable`接口与我们熟知的`Runnable`接口相似,但功能更加强大,主要体现在以下几个方面: 1. **方法签名的...

    浅谈java中异步多线程超时导致的服务异常

    `Runnable`接口不提供返回值,而`Callable`接口则允许线程执行后返回一个结果。在处理异步任务时,我们通常会用到`ExecutorService`,这是一个线程池服务,它可以管理和调度线程执行任务。 当一个线程超时,即在...

    linux pthread 多线程控制示例代码

    在Linux操作系统中,多线程编程是通过POSIX线程库(pthread)来实现的,这个库提供了一套丰富的API,使得开发者可以在单个进程中创建并管理多个执行线程。`pthread`是POSIX标准的一部分,它允许程序员创建轻量级进程...

    Java 线程总结

    Java线程是Java编程中非常重要的一个概念,它允许程序同时执行多个任务,从而提高了程序的效率和响应性。在Java中,线程是通过`java.lang.Thread`类或者实现`java.lang.Runnable`接口来创建和管理的。 1. **线程与...

Global site tag (gtag.js) - Google Analytics