zoukankan      html  css  js  c++  java
  • java多线程学习-java.util.concurrent详解(四) Exchanger

    转载于:http://janeky.iteye.com/blog/769965

    我们先来学习一下JDK1.5 API中关于这个类的详细介绍: 

        “取消的异步计算。利用开始和取消计算的方法、查询计算是否完成的方法和获取计算结果的方法,此类提供了对 Future 的基本实现。仅在计算完成时才能获取结果;如果计算尚未完成,则阻塞 get 方法。一旦计算完成,就不能再重新开始或取消计算。 
    可使用 FutureTask 包装 Callable 或 Runnable 对象。因为 FutureTask 实现了 Runnable,所以可将 FutureTask 提交给 Executor 执行。 
    除了作为一个独立的类外,此类还提供了 protected 功能,这在创建自定义任务类时可能很有用。 “ 

        应用举例:我们的算法中有一个很耗时的操作,在编程的是,我们希望将它独立成一个模块,调用的时候当做它是立刻返回的,并且可以随时取消的 

    package com.winterbe.java8.samples.concurrent;
    
    import java.util.concurrent.Callable;
    import java.util.concurrent.ExecutionException;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    import java.util.concurrent.FutureTask;
    
    public class TestFutureTask {
    
    	public static void main(String[] args) {
    		ExecutorService exec = Executors.newCachedThreadPool();
    
    		FutureTask<String> task = new FutureTask<String>(
    				new Callable<String>() {// FutrueTask的构造参数是一个Callable接口
    					@Override
    					public String call() throws Exception {
    						Thread.sleep(8 * 1000);
    						return Thread.currentThread().getName() + ":0";// 这里可以是一个异步操作
    					}
    				});
    		FutureTask<String> task1 = new FutureTask<String>(
    				new Callable<String>() {// FutrueTask的构造参数是一个Callable接口
    					@Override
    					public String call() throws Exception {
    						Thread.sleep(4 * 1000);
    						return Thread.currentThread().getName() + ":1";// 这里可以是一个异步操作
    					}
    				});
    		try {
    			exec.execute(task);// FutureTask实际上也是一个线程
    			Thread.sleep(1 * 1000);// 睡眠2S,相当于等待方法执行2S,如果还没有执行完成,则取消该线程的执行
    			if (!task.isDone()) {
    				System.out.println("Time out,cancel the "
    						+ Thread.currentThread().getName() + ":0" + ".");
    				task.cancel(true);// 取消
    			}
    			if (!task.isCancelled()) {
    				String result = task.get();// 取得异步计算的结果,如果没有返回,就会一直阻塞等待
    				System.out.printf("get:%s%n", result);
    			}
    
    			exec.execute(task1);
    			Thread.sleep(4 * 1000);
    			if (!task1.isDone()) {
    				System.out.println("Time out,cancel the "
    						+ Thread.currentThread().getName() + ":1" + ".");
    				task1.cancel(true);// 取消
    			}
    			if (!task1.isCancelled()) {
    				String result1 = task1.get();
    				System.out.printf("get:%s%n", result1);
    			}
    
    		} catch (InterruptedException e) {
    			e.printStackTrace();
    		} catch (ExecutionException e) {
    			e.printStackTrace();
    		}
    	}
    
    }
    

          总结:FutureTask其实就是新建了一个线程单独执行,使得线程有一个返回值,方便程序的编写 

  • 相关阅读:
    airodump-ng的使用及显示
    bash shell 遍历一个数组
    cisco 交换机 IOS命令
    apt-key Debian packages密钥管理命令
    find命令的用法
    bash的快捷键
    groff编写man页
    tcpdump软件使用
    vue 项目常见功能(搜索 时间戳转换 过滤器)
    vue2.0 常见功能 (v-for 配置路由 组件渲染)
  • 原文地址:https://www.cnblogs.com/fanxiaojun/p/4914555.html
Copyright © 2011-2022 走看看