zoukankan      html  css  js  c++  java
  • FutureTask

    参考资料

    深入学习FutureTask       http://www.importnew.com/25286.html

    FutureTask应用实例

    package com.person;
    
    import java.util.concurrent.Callable;
    import java.util.concurrent.FutureTask;
    import java.util.concurrent.TimeUnit;
    
    public class FuturnTaskTest {
        /**
         *任务类 :实现Callable,同时可以定义返回值类型
         */
        class CallableTask implements Callable<String>{
            @Override
            public String call() throws Exception {
                String msg = "CallableTask 执行中";
                System.out.println(msg);
                return "CallableTask Done";
            }
            
        }
        
        /**
         * 任务类 :实现Runnable
         */
        class RunnableTask implements Runnable{
    
            @Override
            public void run() {
                String msg = "RunnableTask 执行中";
                System.out.println(msg);
                try {
                    Thread.sleep(10000); //10秒钟
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            
        }
        
        public static void main(String[] args) throws Exception{
            /*构造方法1使用
             * 
             */
            CallableTask callableTask = new FuturnTaskTest().new CallableTask();
            FutureTask<String> futureTask = new FutureTask<String>(callableTask);
            new Thread(futureTask).start();
            System.out.println(futureTask.get());
            
            /*构造方法2使用
             * 这个构造函数会把传入的Runnable封装成一个Callable对象保存在callable字段中,
             * 同时如果任务执行成功的话就会返回传入的result。这种情况下如果不需要返回值的话可以传入一个null
             */
            RunnableTask runableTask = new FuturnTaskTest().new RunnableTask();
            String result ="RunnableTask Done";
            FutureTask<String> runableFutureTask = new FutureTask<String>(runableTask,result); //用到了适配器转换模式
            new Thread(runableFutureTask).start();
            System.out.println(runableFutureTask.get());
            
            /*
             * FutureTask主要方法,重点关注FutureTask源码实现
             */
            futureTask.isDone();
            futureTask.cancel(true); //true表示如果在执行中,则打断,实际只是执行了线程的interrupt()方法,设置了一个线程中断标志位
            futureTask.isCancelled();
            futureTask.get();
            futureTask.get(1,TimeUnit.MINUTES);
            
        }
    
    }

    FutureTask七种状态以及可能变化的四种过程

        /* Possible state transitions:
         * NEW -> COMPLETING -> NORMAL        当Callable或Runnable中的run方法执行完成之前,状态都是NEW
         * NEW -> COMPLETING -> EXCEPTIONAL
         * NEW ->               CANCELLED
         * NEW -> INTERRUPTING -> INTERRUPTED
         */
        private volatile int state;
        private static final int NEW          = 0;
        private static final int COMPLETING   = 1;
        private static final int NORMAL       = 2;
        private static final int EXCEPTIONAL  = 3;
        private static final int CANCELLED    = 4;
        private static final int INTERRUPTING = 5;
        private static final int INTERRUPTED  = 6;
        
        private Callable<V> callable; //保存创建对象时传入的Callable对象
        private Object outcome;  //保存任务执行结果或者异常原因。
        private volatile Thread runner;    
        private volatile WaitNode waiters;
  • 相关阅读:
    delphi 数据导出 进度条自己生成
    在存储过程中编写正确的事务处理代码(SQL Server 2000 & 2005)
    在Delphi中如何获得SQL中存储过程的返回值?
    object-c中管理文件和目录:NSFileManager使用方法
    Delphi中动态链接库(DLL)的建立和使用
    开源免费天气预报接口API以及全国所有地区代码!!(国家气象局提供)
    wince 程序无法执行的原因
    如果我写一个播放器
    busybox配置
    switch case被人忽视的一点!zt
  • 原文地址:https://www.cnblogs.com/walixiansheng/p/9582300.html
Copyright © 2011-2022 走看看