美文网首页
第八周随笔--线程

第八周随笔--线程

作者: 關kwan | 来源:发表于2016-07-03 23:08 被阅读0次

Main/UI Thread && Worker Thread

一般情况下,Worker线程不能直接更新主线程的设置(例如textview.settext()),否则会报错。
若要更新,一般用到以下4种方法:

  • Activity runOnUiThread(Runnable)

  • View.post(Runnable)

  • View.postDelayed(Runnable, long)

  • new Handler(Looper.getMainLooper()).post

    new Thread(new Runnable() { 
        @Override   
        public void run() {  
            // 第一种 
            runOnUiThread(new Runnable() {  
                @Override    
                public void run() {
                   mTextView.setText("……");   
                } 
            });
            // 第二种   
           mTextView.post(new Runnable() {
               @Override    
               public void run() {
                  mTextView.setText("……");            
               }   
           }) ;
           // 第三种  
          mTextView.postDelayed(new Runnable() { 
              @Override  
              public void run() { 
                 mTextView.setText("……");
              }   
          },1000);  
         // 第四种 
         new Handler(Looper.getMainLooper()).post(new Runnable() {   
             @Override    
             public void run() { 
                 mTextView.setText("……");  
             }    
         });
      }
    }).start();
    

线程池

ExecutorServie 线程池,适合处理大量线程。
通过Executors的静态方法来创建,一般有三种:

  1. 单线程 :<code>Executors.newSingleThreadExecutor()</code>;
  2. 固定数量线程 :<code>Executors.newFixedThreadPool()</code>;
  3. 动态线程 :<code>Executors.newCachedThreadPool()</code>;
  4. 定时线程:<code>Executors.newScheduleThreadPool()</code>;

这里我们用固定几个线程来应用,使用方法是创建<code>ExecutorService</code>对象,然后执行<code>submit(r)</code>可以发起一个<code>Runnable</code>对象。
用线程池来管理的好处是,可以保证系统稳定运行,适用与有大量线程,高工作量的情景下使用,假如要展示1000张图片如果创建1000个线程去加载,保证系统会死掉。用线程池就可以避免这个问题,可以用几个线程轮流执行,几个一组,执行完的线程不直接回收而是等待下次执行,这样对系统的开销就可以减小不少。

private ExecutorService service = Executors.newFixedThreadPool(5); 
private void loadImagesByExecutors(final String url,final int id){ 
    service.submit(new Runnable(){ 
        @Override
        public void run() { 
            Log.e("当前线程程:",""+Thread.currentThread().getName());
            try {
                final Drawable drawable = Drawable.createFromStream(new URL(url).openStream(), "image.gif"); 
                mHandler.post(new Runnable(){ 
                    @Override 
                    public void run() {
                        //这将在主线程运行      
                        ((ImageView)MainActivity.this.findViewById(id)).setImageDrawable(drawable); 
                    } 
                });
          } catch (MalformedURLException e) { 
                  e.printStackTrace(); 
          } catch (IOException e) { 
                  e.printStackTrace(); 
          }
      }
   });
}

相关文章

  • 第八周随笔--线程

    Main/UI Thread && Worker Thread 一般情况下,Worker线程不能直接更新主线程的...

  • java多线程(核心篇)第八章

    第八章 线程管理 8.1 线程组 java平台中的任何一个线程都有一个线程组与之有关联,这个线程组可以通过Thre...

  • 第八周教育随笔

    这个学期教学时间比较紧,在课程授课安排上,我做到前紧后松,为的就是后面可以预留一些时间复习,不至于手慢脚乱。期中考...

  • 九四三周年记&今日投资感悟20200904

    1. 94 三周年 李荣强百日写作第八十二天 & 百日随笔第十七天 & 早安分享第八十九天今天是9月4号,对于币圈...

  • 2019 年周记(第八周)

    2019 年周记(第八周) (2019.2.18-2.24) 时间过得真快,我已坚持第八周写周记了,给自...

  • Java之多线程

    今天考虑有关线程的代码问题,如何写多线程,什么的东西应该定义为线程?等等等。。 随笔记下来,防止后面忘记了。。什么...

  • 你所过的年是称心如意的吗?

    2019.0116.坐标宁波,随笔005,这是青栀的第八篇原创文章。 Hi,大家好,我是青栀,今天来更新随笔啦...

  • 第八周小结

    第八周小结 ...

  • 工作三年,小胖不知道线程池的阻塞队列?真的菜!

    欢迎来到狗哥多线程系列连载。本篇是线程相关的第八篇,前七篇分别是: 创建线程到底有几种方式?[http://mp....

  • 2018-11-18

    谭琴第八周周检视 飞速地又过了一周。时间过得很快,这一周又到了第八周感觉时间管理,感觉这一周有很多的事情很急...

网友评论

      本文标题:第八周随笔--线程

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