第八周随笔--线程

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. 单线程 :Executors.newSingleThreadExecutor();
  2. 固定数量线程 :Executors.newFixedThreadPool();
  3. 动态线程 :Executors.newCachedThreadPool();
  4. 定时线程:Executors.newScheduleThreadPool();

这里我们用固定几个线程来应用,使用方法是创建ExecutorService对象,然后执行submit(r)可以发起一个Runnable对象。
用线程池来管理的好处是,可以保证系统稳定运行,适用与有大量线程,高工作量的情景下使用,假如要展示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(); 
          }
      }
   });
}

你可能感兴趣的:(第八周随笔--线程)