承诺模式(promise)

来源:互联网 发布:微信宣传软件 编辑:程序博客网 时间:2024/04/28 16:42

五、承诺模式(promise)

1、核心思想
异步编程,避免不必要的等待,增加系统的并发性。
2、也支持同步,只需将new Thread(task).start() 改成task.run()
通过凭证获取result时一定要注意不能被一直阻塞。
3、可复用代码

4、参考网站

public class DataSyncTask implements Runnable {    @Override    public void run() {        Future<FTPClientUtil> ftpPromise = FTPClientUtil.newInstance();        getDataFromDB();        FTPClientUtil ftpClientUtil = null;        try {            System.out.println("promise get result begin");            ftpClientUtil = ftpPromise.get();            System.out.println("promise get result end");        } catch (InterruptedException e) {        ;        } catch (ExecutionException e) {            throw new RuntimeException(e);        }        uploadFiles(ftpClientUtil);    }    private void uploadFiles(FTPClientUtil ftpClientUtil) {        // TODO Auto-generated method stub        ftpClientUtil.upload();    }    private void getDataFromDB() {        // TODO Auto-generated method stub        System.out.println("get data from db begin");        try {            Thread.sleep(1000);        } catch (InterruptedException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }           System.out.println("get data from db end");    }}public class FTPClientUtil {    private volatile static ThreadPoolExecutor threadPoolExecutor;    static {        threadPoolExecutor = new ThreadPoolExecutor(1, Runtime.getRuntime().availableProcessors()*2,                 60, TimeUnit.SECONDS,                 new ArrayBlockingQueue<Runnable>(10),                new ThreadFactory() {                    @Override                    public Thread newThread(Runnable r) {                        Thread t = new Thread(r);                        //设置线程为“守护线程”,任务执行完成JVM会自动结束                        t.setDaemon(true);                        return t;                    }                },                new ThreadPoolExecutor.CallerRunsPolicy());    }    //私有构造器    private FTPClientUtil(){    }    public static Future<FTPClientUtil> newInstance() {        Callable<FTPClientUtil> callable = new Callable<FTPClientUtil>() {            @Override            public FTPClientUtil call() throws Exception {                FTPClientUtil self = new FTPClientUtil();                self.init();                return self;            }        };        final FutureTask<FTPClientUtil> task = new FutureTask<FTPClientUtil>(callable);        //客户端并发量大用线程池        threadPoolExecutor.execute(task);        //new Thread(task).start();        return task;    }    protected void init() throws Exception {        // TODO Auto-generated method stub        System.out.println("init future begin");        Thread.sleep(2000);        System.out.println("init future end");    }    public void upload() {        System.out.println("upload file over");    }}public class Main {    public static void main(String[] args) {        Thread thread = new Thread(new DataSyncTask());        thread.start();    }}
0 0
原创粉丝点击