IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android 多线程:Thread理解和使用总结 -> 正文阅读

[移动开发]Android 多线程:Thread理解和使用总结

线程和进程的区别.

  • 进程:操作系统运行程序时分配资源的最小单位,进程和进程之间是相互独立的
  • 线程: cpu调度的最小单位,它必须依赖于进程.线程在运行时会占用该进程的部分资源,线程之间是可以共享该进程所拥有的全部资源.但是线程与线程之间也有自己的独立空间,称之为线程私有空间.

Android中进程和线程之间的关系

启动一个App就会启动一个进程,进程名为其包名。一个进程里面会启动多个线程,线程必须依赖进程

多线程引发的问题

  • 线程死锁导致进程Anr 原因:因为一个进程中多线程是资源共享的, 也就是都可以访问同一内存地址当中的一个变量;当多个线程在竞争多个资源的时候出现了锁之间的互相等待问题的时候就会死锁
  • 比如: 亿如有三个线程,主线程main,和二个子线程A B; 还有二个锁lock1, lock2;二个子线程在跑的时候,假如线程A在执行的时候需要获取锁lock1, 在执行代码时又需要获取锁lock2, 线程B它需要获取锁lock2,在执行代码的时候又需要获取锁lock1.线程A一直在等锁2释放,而线程B一直在等锁lock1释放.这样线程AB就会出现死锁现象,而这时main线程需要lock1或者Lock2的话,这样就一直获取不了,这就主线程就会阻塞.
    代码如下:当执行main ()方法时,下面就会出现死锁
Object lock1 = new Object();
Object lock2 = new Object();

private void lockOneM(){
	synchronized(lock1){
		Thread.sleep(2000);
		lockTwoM();
	}
}

private void lockTwoM(){
	synchronized(lock2){
		Thread.sleep(2000);
		lockOneM();
	}
}
private void main (){
	new Thread(() -> {
	   lockOneM();
	}).start();

	new Thread(() -> {
	   lockTwoM();
	}).start();
}

解决死锁方法:
上面是争夺资源顺序不对,把lockTwoM方法里面的锁都换成lock1,这样就不存在竞争多个资源了。

创建线程的方式

new Thread(() -> {
}).start();

new Thread() {
    @Override
    public void run() {
        super.run();
    }
}.start();

Runnable runnable = new Runnable() {
    @Override
    public void run() {
    }
};
Thread thread = new Thread(runnable);
thread.start();

FutureTask<String> future = new FutureTask<>(() -> {
    try {
        Thread.sleep(3000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    return "执行完成";
});
Thread thread1 = new Thread(future);
thread1.start();
try {
	//阻塞式
    String s = future.get();
} catch (Exception e) {
    e.printStackTrace();
} 

线程只有执行start()方法才是真正的创建线程

线程生命周期

Runnable runnable = new Runnable() {
    @Override
    public void run() {
    	//运行状态
    }
};
Thread thread = new Thread(runnable);//创建线程对象
thread.start();//线程处于就绪状态,待cpu时间片轮转到自己
//当cpu时间片轮转到自己,执行run()方法 运行状态
thread.join(); //如果调用这个方法会立马获得执行权直到run()方法执行完才会释放,除非调用yield()方法
thread.yield();//让线程从运行状态调整到就绪状态,待cpu时间片轮转到自己
try {
      Thread.sleep(100000);
} catch (InterruptedException e) {
    e.printStackTrace();
    //如果在这里再执行一次话,isInterrupted()会返回true,所以可以使用isInterrupted()这个方法来判断安全退出线程
    thread.interrupt()
}
Thread.sleep(10000);//阻塞线程,不会释放锁,不会让出cpu执行权,直到时间到,线程会调整到就绪状态。
thread.interrupt();//调用interrupt()这个方法,会触发sleep()方法的catch里面,但是isInterrupted()这个方法还是会返回false。因为sleep里会重置空上值
try {
	synchronized (thread ){
		//wait方法,这个是Object内的方法,执行wait()方法会让线程进入到待,释放锁,让出cpu执行权,且一定要加锁,并且锁要是自己
 	   wait();
 	}
} catch (InterruptedException e) {
    e.printStackTrace();
    //如果在这里再执行一次话,isInterrupted()会返回true,所以可以使用isInterrupted()这个方法来判断安全退出线程
    thread.interrupt()
}

synchronized (thread ){
	thread.notify();//线程进入到就绪状态,执行wait()后面逻辑。 且一定要加锁,且锁的要是和wait()一样的类
}
//当run()方法执行完,则线程死亡

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-10-20 12:36:02  更:2021-10-20 12:36:42 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 0:41:37-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码