Android学习第八周_使用率超高的多线程开发

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/cqupt2011214692/article/details/51232613

1.线程的基本概念

线程就是一条工作线,就像工厂的流水线一样。而多线程就是多条线程同时工作。使用多线程的目的就是提高工作效率,保证系统不会出现卡顿现象。基本的原理是,cpu是按顺序执行的,但是由于其速度很多,程序中如果存在多个线程,cpu就可以在线程之间切换工作,因为速度快,所以看上去线程之间是同步执行的。

2.如何使用多线程

在android中多线程的原理和java多线程的原理类似,只是在原有的基础上多一些类进行了封装,所以使用起来会更加的方便。
- Main/UI Thread和Worker Thread
- Main/UI Thread和Worker Thread之间的通信
- Thread/Runnable

3.多线程

  • Main/UI Thread和Worker Thread
  • Main/UI Thread和Worker Thread之间的通信
  • Thread/Runnable
  • 线程安全
    a.Activity.runOnUiThread(Runnable)
    b.View.post(Runnable)
    c.View.postDelay(Runnable,long)
  • Handler
  • AsyncTask 同步代码块(synchronized block)

代码实现如下:

   // Worker 线程
   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();

//用AsynTaskL来处理
class TestTask extends AsyncTask<Integer,Integer,String>{

    @Override
    protected void onPreExecute() {
        // main thread ,before doInBackground();
        mTextView.setText("加载中");
        super.onPreExecute();
    }

    @Override
    protected String doInBackground(Integer... params) {
        // worker thread
        // download parse xml data
        return String.valueOf(params[0] * 2 + 2);
    }

    @Override
    protected void onPostExecute(String result) {
        super.onPostExecute(result);
        // main thread ,after doInBackground();
        mTextView.setText("加载完成, 结果是:" + result);
    }
}

4.new Thread()与ThreadPoolExecutor的对比

1.new Thread()的缺点

  • 每次new Thread的新建对象性能差
  • 线程缺乏统一的管理,可能无限制新建线程,相互之间竞争,及可能占用过多系统资源导致死机或oom
  • 缺乏更多功能,如定时执行、定期执行、线程中断。

2.ThreadPoolExecutor的优点

  • 提升性能。创建和小号对象费时费CPU资源
  • 防止内存过度小号。控制活动线程的数量,防止并发线程过多

5.线程池

android中主要要用的线程池如下:
(1) newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程, 若无可回收,则新建线程。
(2) newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
(3) newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。
(4) newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。

6.Handler处理处理主线程与异步线程的交互

代码如下:

 // update UI   在异步线程中发送消息 

 Message message = mHandler.obtainMessage();
        message.obj = progress;
        message.what = 0;
        mHandler.sendMessage(message);


       //主线程中处理
       @Override
       public void handleMessage(Message msg) {
            super.handleMessage(msg);
            MainActivity activity = mActivity.get();

           switch (msg.what) {
            case 0:
            int progress = (int) msg.obj;
            activity.getProgressBar().setProgress(progress);
            activity.getTextView().setText("进度:" + progress + "%");
            if(progress == 100){
                Toast.makeText(activity, "download success",                      Toast.LENGTH_SHORT).show();
            }
            break;
    }
}

猜你喜欢

转载自blog.csdn.net/cqupt2011214692/article/details/51232613
今日推荐