重拾Android之--多线程技术

重拾Android之–多线程技术

  • 多线程的创建

1、继承Thread类实现多线程
2、实现Runnable接口实现多线程

// 继承Thread类实现多线程
public class MyThread extends Thread {
    @Override
    public void run() {
        Log.i("message", "多线程实现");
    }
}

MyThread myThread = new MyThread();
myThread.start();

// 实现Runnable接口实现多线程
public class MyRunnable implements Runnable {
    @Override
    public void run() {
        Log.i("message", "runnable 实现多线程" + Thread.currentThread().getName());
    }
}

MyRunnable runnable = new MyRunnable();
Thread thread = new Thread(runnable);
thread.start();
  • 线程池的使用

Android中常用的几种线程池
1、newCachedThreadPool 缓存线程池
2、newFixedThreadPool 能控制最大的并发数的线程池
3、newSingleThreadExecutor 串行线程池
4、newSingleThreadScheduledExecutor 能定时执行的线程池

Demo:

// newCachedThreadPool
public void testCachedThreadPool() {
    ExecutorService service = Executors.newCachedThreadPool();
    for (int i = 0; i < 10; i++) {
        final int index = i;
        try {
            Thread.sleep(2 * 1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        service.execute(new Runnable() {
            @Override
            public void run() {
                Log.i("线程池", Thread.currentThread().getName() + " " + index);
            }
        });
    }
}

// newFixedThreadPool
private void testFixThread() {
    // 设置最大的并发数为2
    ExecutorService service = Executors.newFixedThreadPool(2);
    for (int i = 0; i < 10; i ++) {
        final int index = i;
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        service.execute(new Runnable() {
            @Override
            public void run() {
                Log.i("线程池", Thread.currentThread().getName() + " " + index);
            }
        });
    }
}

// newSingleThreadExecutor 串行执行
private void testSingleThread() {
    ExecutorService service = Executors.newSingleThreadExecutor();
    for (int i = 0; i < 10; i ++) {
        final  int index = i;
        service.execute(new Runnable() {
            @Override
            public void run() {
                Log.i("线程池", Thread.currentThread().getName() + " " + index);
            }
        });
    }
}

// newSingleThreadScheduledExecutor 设置定时执行
private void testScheduled() {
    ScheduledExecutorService scheduledExecutorService = Executors.newSingleThreadScheduledExecutor();
    // 定时3秒后执行
//        scheduledExecutorService.schedule(new Runnable() {
//            @Override
//            public void run() {
//                Log.i("线程池", Thread.currentThread().getName());
//            }
//        },3, TimeUnit.SECONDS);

    // 定时3秒后执行,每隔2秒继续执行
    scheduledExecutorService.scheduleAtFixedRate(new Runnable() {
        @Override
        public void run() {
            Log.i("线程池", Thread.currentThread().getName());
        }
    }, 3, 2, TimeUnit.SECONDS);
}
  • 异步消息处理机制(线程之间的通讯)

1、使用Handle类来实现
2、使用AsyncTask

Handle类来实现线程之间的通讯

// 在子线程中发送消息
new Thread(new Runnable() {
    @Override
    public void run() {
        // 发送空消息
        // handler.sendEmptyMessage(1);
        // 延时两秒发送一个空消息
        // handler.sendEmptyMessageDelayed(1, 2000);
        // 利用message来携带数据
        Message message = new Message();
        message.what = 2;
        message.obj = "obj";
        handler.sendMessage(message);
    }
}).start();

// 在Handler中处理子线程发送的数据
private Handler handler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        switch (msg.what) {
            case 1:
                // 主线程,接收到子线程传递的数据
                break;
            case 2:
                button.setText((String)msg.obj);
                break;
        }
    }
};
    
// 第二种、利用handler发送post回到主线程
handler.post(new Runnable() {
    @Override
    public void run() {
        // 在主线程
        Log.i("post", Thread.currentThread().getName());
        button.setText("post");
    }
});

// 发送延时post
handler.postDelayed(new Runnable() {
    @Override
    public void run() {
        // 在主线程
        Log.i("postDelayed", Thread.currentThread().getName());
        button.setText("post");
    }
}, 2000);

// 第三种 利用View的post方法回到主线程
button.post(new Runnable() {
    @Override
    public void run() {
        Log.i("button.post", Thread.currentThread().getName());
        button.setText("button.post");
    }
});

// 第四种 利用Activity的runOnUiThread方法
runOnUiThread(new Runnable() {
    @Override
    public void run() {
        Log.i("runOnUiThreadt", Thread.currentThread().getName());
        button.setText("runOnUiThread");
    }
});

AsyncTask

继承AsyncTask来实现异步任务,AsyncTask的泛型参数,第一个参数代表传入的参数,第二个代表返回当前任务的进度,第三个代表返回的参数类型

class MyAsyncTask extends AsyncTask<String, Integer, String> {
    // 后台任务执行之前调用,准备
    @Override
    protected void onPreExecute() {
        Log.i("message", "后台任务执行之前调用,准备");
    }

    @Override
    protected String doInBackground(String... strings) {
        // 后台任务 传入的参数 strings
        // 回调主线程进度
        publishProgress();
        Log.i("message", "doInBackground");
        return "返回的数据";
    }

    // 后台任务结束后在主线程执行
    @Override
    protected void onPostExecute(String s) {
        Log.i("message", "onPostExecute");
        button.setText(s);
    }

    // 回到主线程更新进度
    @Override
    protected void onProgressUpdate(Integer... values) {
        Log.i("message", "onProgressUpdate");
    }
}

//  使用
new MyAsyncTask().execute("传入的参数");
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值