Android多线程:基础介绍

每次学到的东西和运用的知识总是片面性的,没有一个很好的沉淀,近段时间有了空闲时间,所以对自身学到的点,进行一个简单的记录:

一、线程

1、定义

线程:程序中单独顺序的控制流,线程本身依靠程序进行运行,只能使用分配给程序的资源和环境。

2、作用

减少程序在并发执行时所付出的时空开销,提高操作系统的并发性能。

3、实现

继承Thread类

public class MyThread extends Thread {
    @Override
    public void run() {
        super.run();
    }
}

实现Runnable接口

public class MyRunnable implements Runnable {
    @Override
    public void run() {
    }
}

4、状态

——创建状态:new 一个新线程对象
——就绪状态:调用start()方法,等待cpu进行调度
——运行状态:执行run()方法
——阻塞状态:sleep()/wait()暂时停止执行状态,可能把资源交给其他线程使用
——终止状态:线程销毁


示意图.png

5、线程属性

5.1、线程优先级

在Java程序设计语言中,每个线程都有一个优先级。默认情况下,一个线程继承他的父线程的优先级。使用setPriority(int newPriority)方法提高或者降低任何一个线程的优先级。

表示
// 譬如:
Thread.MIN_PRIORITY // 优先级1
Thread.NORM_PRIORITY // 默认优先级5
Thread.MAX_PRIORITY // 优先级10

注意:提高抢到cpu资源的可能性,但并不是一定能抢到cpu资源。

5.2、守护线程

定义:守护用户线程的线程,即在程序运行时为其他线程提供一种通用服务
常见:如垃圾回收线程
设置
//标识该线程为守护线程或用户线程。这一方法必须在线程启动之前调用。
setDaemon(boolean isDaemon)

5.3、非守护线程(用户线程)

主要包括:主线程&子线程

a. 主线程(UI线程)

定义:Android系统在程序启动时会自动启动一条主线程
作用:处理四大组件与用户进行交互的事情(如UI、界面交互相关)
注:因为用户随时会与界面发生交互,因此主线程任何时候都必须保持很高的响应速度,所以主线程不允许进行耗时操作,否则会出现ANR

b. 子线程(工作线程)

定义:手动创建的线程
作用:耗时的操作(网络请求、I/O操作等)

5.4 守护线程 与 非守护线程的区别

区别:虚拟机是否已退出:
当所有用户线程结束时,因为没有守护的必要,所以守护线程也会终止,虚拟机也同样退出
反过来,只要任何用户线程还在运行,守护线程就不会终止,虚拟机就不会退出

6、线程中的方法

sleep()和wait()
区别:
Java中的多线程是一种抢占式的机制 而不是分时机制。抢占式机制指的是有多个线程处于可运行状态,但是只有一个线程在运行。
共同点:
(1)、它们都是在多线程的环境下,都可以在程序的调用处阻塞指定的毫秒数,并返回。
(2)、wait()和sleep()都可以通过interrupt()方法 打断线程的暂停状态 ,从而使线程立刻抛出InterruptedException。
如果线程A希望立即结束线程B,则可以对线程B对应的Thread实例调用interrupt方法。如果此刻线程B正在wait/sleep /join,则线程B会立刻抛出InterruptedException,在catch() {} 中直接return即可安全地结束线程。
需要注意的是,InterruptedException是线程自己从内部抛出的,并不是interrupt()方法抛出的。对某一线程调用 interrupt()时,如果该线程正在执行普通的代码,那么该线程根本就不会抛出InterruptedException。但是,一旦该线程进入到 wait()/sleep()/join()后,就会立刻抛出InterruptedException 。

不同点:
(1)、Thread类的方法:sleep(),yield()等
Object的方法:wait()和notify()等
(2)、每个对象都有一个锁来控制同步访问。Synchronized关键字可以和对象的锁交互,来实现线程的同步。
sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。
(3)、wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用
(4)、sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常

二、多线程

1、定义

多个线程同时进行任务的执行,目的为了更好的使用CPU资源。

其实,计算机任何特定时刻只能执行一个任务;
多线程只是一种错觉:只是因为JVM快速调度资源来轮换线程,使得线程不断轮流执行,所以看起来好像在同时执行多个任务而已

2、作用

用来解决以下两种情况:
1、不阻塞UI线程:不在主线程中进行耗时操作。
2、不在非UI线程中更新UI组件。

3、使用场景

1、将耗时操作放在工作线程中进行。
2、将UI更新操作放在UI线程中进行。

4、实现方式

1、基础使用:

继承Thread
实现Runnable接口
Handler

2、复合使用

1、AsyncTask
2、HandlerThread
3、IntentService

3、高级使用

1、线程池 ThreadPool

5、同步与死锁

在大多数实际的多线程应用中,两个或者两个以上的线程需要共享对同一数据的存取,这种操作属于线程同步。
同步方法:用synchronized关键字进行修饰。

    public synchronized void wAndroid(){
         }

死锁:死锁就是两个或者两个以上的线程阻塞着,并且在等待其他死锁线程持有的锁。

三、进程

每一个应用程序启动时对应一个进程,一个进程包含一个或多个线程,一个进程至少包含一个线程。

四、总结

此篇文章中,对线程的基础知识进行了一个自我认知的一个统计,也是对自身的一个理解的记录,后期会一直进行完善。如果哪里理解的不对,欢迎指出。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,185评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,445评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,684评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,564评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,681评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,874评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,025评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,761评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,217评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,545评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,694评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,351评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,988评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,778评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,007评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,427评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,580评论 2 349

推荐阅读更多精彩内容

  • Java多线程学习 [-] 一扩展javalangThread类 二实现javalangRunnable接口 三T...
    影驰阅读 2,952评论 1 18
  • 本文主要讲了java中多线程的使用方法、线程同步、线程数据传递、线程状态及相应的一些线程函数用法、概述等。 首先讲...
    李欣阳阅读 2,444评论 1 15
  • 林炳文Evankaka原创作品。转载自http://blog.csdn.net/evankaka 本文主要讲了ja...
    ccq_inori阅读 648评论 0 4
  • 一扩展javalangThread类二实现javalangRunnable接口三Thread和Runnable的区...
    和帅_db6a阅读 485评论 0 1
  • 前言:虽然自己平时都在用多线程,也能完成基本的工作需求,但总觉得,还是对线程没有一个系统的概念,所以,查阅了一些资...
    justCode_阅读 701评论 0 9