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

第八周随笔--线程

作者: 關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(); 
              }
          }
       });
    }

    相关文章

      网友评论

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

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