前言
1.同步:一步一步来,一个时间只能做一件事情。
2.异步:一个时间可以同时做多个事情。
提示:以下是本篇文章正文内容,下面案例可供参考
一、多线程相关
1.何为线程、多线程?
线程:一个独立执行路径;进程想要执行任务就需要依赖线程。换句话说,就是进程中的最小执行单位就是线程,并且一个进程中至少有一个线程。
多线程:同一时间内处理多项任务,从而提高效率和响应速度。
2. 为什么要使用多线程?
- 提高程序运行速度:多线程可以并行处理任务,加快程序的执行速度。
- 提高资源利用率:通过后台处理长时间运行的任务,多线程可以使CPU和内存资源得到更有效的利用。
- 用户界面的响应性:用户界面可以在执行其他任务时保持响应状态,提高用户体验。
- 并发执行多个任务:多线程允许程序的不同部分同时执行,这样可以在等待某些操作(如I/O操作)完成时继续执行其他任务。
- 优化性能:可以为不同的线程设置不同的优先级,以优化整体性能。
3. ANR(Application Not Responding):应用程序无响应;
4. 什么时候使用多线程:不使用ANR时,耗时操作时
5. Android当中的多线程:
① 基础使用:
- 继承Thread类:创建一个线程类继承自Thread,并重写其run()方法。然后创建该类的实例并调用start()方法来启动线程。
- 实现Runnable接口:创建一个实现Runnable接口的类,并实现其run()方法。然后创建该类的实例,将其作为参数传递给Thread类的构造函数,并调用Thread的start()方法来启动线程。
- 使用Handler:Handler是Android中用于处理线程间通信的机制。它允许你发送和处理Message和Runnable对象与一个线程的MessageQueue关联。
② 复合使用:
- AsyncTask:这是一个轻量级的异步任务类,它允许你在后台线程中执行耗时操作,然后在主线程中更新UI。
- HandlerThread:这是一个具有Looper的线程类,它可以创建一个消息循环,并通过Handler与其他线程通信。
- IntentService:这是一个服务类,它使用工作线程来处理所有的start请求。
③高级使用:主要是指线程池(ThreadPool),它提供了一个可重用的线程集合来执行任务,可以有效地管理线程资源。
6. Main/UI Thread(主线程) 和 Worker Thread(工作线程)
7. Thread / Runnable 线程安全
- 继承Thread类更简单直接,但可能导致继承体系结构受限;
- 而实现Runnable接口更加灵活,可以与其他继承结构结合使用,并且允许多个线程共享同一任务实例。
- 线程安全是指在多线程环境下,代码能够正确处理多个线程并发访问共享资源的情况,不会出现数据不一致或者其他的意外情况。
8. 普通的主线程更新
- ① Activity.runOnUiThread(Runnable)
- ② View.post(Runnable)
- ③ View.postDelayed(Runnable, long
9. Handler:对线程之间的通信
10. AsyncTask
- ① 目的:方便后台线程中操作后更新UI
- ② 实现:Thread和Handler进行了封装
- ③ 实质:Handler异步消息处理机制
二、AsyncTask
1.详解
AsyncTask的方法:
package com.example.asynctaskapplication; import android.os.AsyncTask; import android.os.Bundle; import android.util.Log; import androidx.appcompat.app.AppCompatActivity; public class MainActivity extends AppCompatActivity { private static final String TAG = "MainActivity"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); new DownloadAsyncTask().execute("imooc","good"); } public static class DownloadAsyncTask extends AsyncTask<String,Integer,Boolean>{ /* * 在异步任务之前,在主线程中 * */ @Override protected void onPreExecute() { super.onPreExecute(); //可操纵UI } /* * 在另外一个线程处理数据 * */ @Override protected Boolean doInBackground(String... params) { for (int i = 0; i < 10000; i++) { Log.i(TAG,"doInBackground: " + params[0]); // 抛出进度 publishProgress(i); } try { Thread.sleep(100000); } catch (InterruptedException e) { e.printStackTrace(); } return true; } @Override protected void onPostExecute(Boolean aBoolean) { super.onPostExecute(aBoolean); // 也是在主线程中,执行结果 处理 } @Override protected void onProgressUpdate(Integer... values) { super.onProgressUpdate(values); // 收到进度,然后处理: 也是在UI线程中。 } @Override protected void onCancelled(Boolean aBoolean) { super.onCancelled(aBoolean); } @Override protected void onCancelled() { super.onCancelled(); } } }
- 泛型参数:<Params,Progress,Result>
- UI操作 onPreExecute onPostExecute
- 后台线程操作 doInBackground
- 输入输出 Params, Result
- 进度显示 onProgressUpdate
- Show me the code: 下载文件等功能。
总结
提示:这里对文章进行总结
1.实践
2.原理
3.异步
4.性能
5.行程池