zoukankan      html  css  js  c++  java
  • 如何取消一个正在运行的线程


    ====================问题描述====================
    我现在想实现的功能是,点击左边9个按钮中的任一个,创建10个线程向服务器请求10张图片,我现在遇到的麻烦就是,当我快速而且连续随机点击左边的按钮时,那不是会创建几十甚至上百个线程啊(已测试,线程过多直接导致手机死掉了),而我只想要最后一次点击按钮请求的图片。大家帮我想想怎么办啊,我是该只创建一个线程请求完一张图片后,再去创建线程请求下一张,还是怎么办啊!我不知道怎么kill掉一个正在运行的线程,注:该线程无循环.
    大家有什么好的思路都说说啊

    ====================解决方案1====================
    10个线程太多了,建议你用线程池 开4,5个线程 可以复用 毕竟线程非常消耗CPU和内存。
    线程是无法立刻停止的,可以在线程里面添加标志位如果线程下载图片成功就无需循环了,
    如果用了线程池那就不需要了,可以长期利用线程,大概开2个线程就好了。
    ====================解决方案2====================
    用线程池吧,除非是优先级很高的,不然一般是用线程池

    用法参考这篇文章
    ====================解决方案3====================
    引用 楼主 jhonzengxuejun 的回复:
    我现在想实现的功能是,点击左边9个按钮中的任一个,创建10个线程向服务器请求10张图片,我现在遇到的麻烦就是,当我快速而且连续随机点击左边的按钮时,那不是会创建几十甚至上百个线程啊(已测试,线程过多直接导致手机死掉了),而我只想要最后一次点击按钮请求的图片。大家帮我想想怎么办啊,我是该只创建一个线程请求完一张图片后,再去创建线程请求下一张,还是怎么办啊!我不知道怎么kill掉一个正在运行的线程,注:该线程无循环.
    大家有什么好的思路都说说啊


    你既然是10个线程,那么,就判断一下这十个线程还在不在,如果在,要么不允许再请求,要么就是把请求排个队。。。

    当然楼上说线程池,也是一个办法,
    ====================解决方案4====================
    可以用IntentService启动后台服务加载线程,这个只会一个一个的加载,加载完一个就会结束掉一个线程
    ====================解决方案5====================
    可以提交执行FutuTask 
    
     ExecutorService aa = Executors.newCachedThreadPool();
      FutureTask<String>  a = new FutureTask<String>(new Callable<String>() {
    
    @Override
    public String call() throws Exception {
    return null;
    }
     
       });
      aa.submit(a);
      a.cancel(true);
    
  • 相关阅读:
    中国年薪 ¥30 万和美国年薪$ 10 万的生活水平异同
    汽车之家CMDB设计思路 – 汽车之家运维团队博客
    平民软件 | 中间件
    FIT2CLOUD
    ZeroBrane Studio
    新炬网络-领先数据资产运营商 | 数据资产管理 | 数据库运维 | 自动化运维
    中国(南京)软件开发者大会
    夏仲璞 | 全球软件开发大会北京站2016
    Nginx下流量拦截算法 | 夏日小草
    docker~dockertoolbox的加速器
  • 原文地址:https://www.cnblogs.com/lianxu61/p/4001895.html
Copyright © 2011-2022 走看看