简单组装线程池

作者: 麦兜叮叮当 | 来源:发表于2017-01-26 17:12 被阅读23次

后天就是大年初一啦!提前祝大家2017年大吉大利!

步入正题
其实我们从网络上拉取(加载)一张图片很简单,随随便便几行代码搞定,那我们的图片拉取池的意义在什么地方呢?首先我们用于图片拉取的线程是可控的,也就是说可以随时取消。其次我们内部封装了一层线程池,保证了我们拉取的图片是有序的。对于如何得到拉取之后的图片,我采用的是接口回调,每拉取一次都会返回给调用者。

好,现在我们看代码。

public class ThreadPool {
    
    private static ExecutorService exec;
    private static ThreadPool threadPool;
    
    public static ThreadPool getInstance(){
        if(threadPool != null){
            return threadPool;
        }
        synchronized (ThreadPool.class) {
            if(threadPool == null){
                threadPool = new ThreadPool();
            }
        }
        return threadPool;
    }
    
    private ThreadPool(){
        exec = Executors.newFixedThreadPool(1);
    }
    
    public ThreadListener exec(Runnable runnable){
        Future<?> future = exec.submit(runnable);
        ThreadListener listener = new ThreadListener(future);
        return listener;
    }
    
    public static class ThreadListener{
        
        private Future<?> f;
        
        public ThreadListener(Future<?> future){
            this.f = future;
        }
        
        //试图取消线程,返回true表示取消成功
        public boolean cancle(){
            return f.cancel(true);
        }
        
        //判断是否完成
        public boolean isDone(){
            return f.isDone();
        }
    }
    
}

这里使用单例模式对线程池进行了一层封装,注意这里我们并没有使用execute()方法,而是采用submit方法并返回一个Future对象,这样做的好处就是,我们可以控制线程,可以随时取消并且判断是否完成等等。

public interface Callback {

    void getBitmap(Bitmap bitmap);

}

接口,用于返回bitmap。

public class LoadImage {

    private ThreadPool.ThreadListener threadListener;
    private String url;
    private final int readTimeout = 8*1000;
    private final int connectTimeout = 8*1000;
    private final String requestMethod = "GET";
    private InputStream inputStream;
    private Callback callback;

    public LoadImage(String url, Callback callback){
        this.callback = callback;
        ThreadPool threadPool = ThreadPool.getInstance();
        this.url = url;
        threadListener = threadPool.exec(new Runnable() {
            @Override
            public void run() {
                runnableWorker();
            }
        });
    }

    private void runnableWorker(){
        try {
            URL mURL = new URL(url);
            HttpURLConnection httpURLConnection = (HttpURLConnection) mURL.openConnection();
            httpURLConnection.setRequestMethod(requestMethod);
            httpURLConnection.setDoOutput(true);
            httpURLConnection.setDoInput(true);
            httpURLConnection.setReadTimeout(readTimeout);
            httpURLConnection.setConnectTimeout(connectTimeout);
            inputStream = httpURLConnection.getInputStream();
            Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
            callback.getBitmap(bitmap);
        } catch (IOException e) {
            callback.getBitmap(null);
        } finally {
            try {
                inputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    public boolean cancle(){
        return threadListener.cancle();
    }

    public boolean isDone(){
        return threadListener.isDone();
    }
}

这里我们对接口、线程池以及网络拉取进行二次封装。现在核心的方法我们已经封装完毕,针对于不同的使用,我们可以再进行一层简单的封装调用。

使用就非常简单了:

new LoadImage("图片网址", new Callback() {
            @Override
            public void getBitmap(Bitmap bitmap) {

            }
        });

笔者能力有限,不足之处欢迎指出!

相关文章

  • 简单组装线程池

    后天就是大年初一啦!提前祝大家2017年大吉大利! 步入正题其实我们从网络上拉取(加载)一张图片很简单,随随便便几...

  • java高级应用:线程池全面解析

    什么是线程池? 很简单,简单看名字就知道是装有线程的池子,我们可以把要执行的多线程交给线程池来处理,和连接池的概念...

  • 最全面Java线程池解析

    什么是线程池? 很简单,简单看名字就知道是装有线程的池子,我们可以把要执行的多线程交给线程池来处理,和连接池的概念...

  • Java中的ThreadPoolExecutor线程池

    今天简单来和大家一起学习一下,java中的ThreadPoolExecutor线程池。 线程池简介 背书中,线程池...

  • java线程池

    线程池的概念 简单来说线程池就是一个管理线程的池子,当我们有任务需要执行无需创建线程,只需要将任务提交到线程池即可...

  • Java - 线程池总体预览

    Executors提供多种线程池的实现,下面对每种线程池进行简单介绍。 1. newCachedThreadPoo...

  • 线程池简易实现和线程池源码

    线程池简单实现 源码 ThreadPoolExecutor 使用 int 的高 3 位来表示线程池状态,低 29 ...

  • InheritableThreadLocal还存在的问题

    [toc] 问题场景 我们使用线程时候往往不会只是简单的new Thread对象,而是使用线程池,当然使用线程池的...

  • java-threadpool

    线程池的好处 利用线程池管理多线程可以控制最大并发的问题,同时可以只能加服务器资源的利用率 线程池的简单使用 1,...

  • 手写线程池

    简单的线程池接口定义 定义基本方法 执行任务 submit execute 关闭线程池 shutdown shu...

网友评论

    本文标题:简单组装线程池

    本文链接:https://www.haomeiwen.com/subject/lboxittx.html