• 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;
  • 相关阅读:
    SSH--1
    oracle---jdbctest--laobai
    oracle---jdbc--laobai
    oracle--知识点汇总2---laobai
    Tomcat_Java Web_内存溢出总结
    单例经典示例
    线程--demo3
    网络通信---示例
    验证码---示例
    java--绘图
  • 原文地址:https://www.cnblogs.com/walixiansheng/p/9582300.html
Copyright © 2020-2023  润新知