第八周随笔--线程

2016-07-03  本文已影响0人  關kwan

Main/UI Thread && Worker Thread

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


线程池

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(); 
          }
      }
   });
}
上一篇下一篇

猜你喜欢

热点阅读