带你从头到脚学习多线程2--基础篇

Q:从这篇文章你能学到什么?
A:谈到多线程,涉及的方面简直是多到爆。对于java后台来说,多线程是必修中的必修。但是对于我们android开发来说,多线程也是非常非常重要的,就算实际开发中比较少用到的,但是为了面试,我们也得拼命学,你说是不是?

屁话:

其实开发中慢慢懂的一些道理,就是开发项目过程中遇到一些新需求,这些需求用到的知识点你可能稍微有点了解,一般我们先照着这个你知道的方向去BD CV过来(进度永远大于一切,你懂的),然后有空再完善学习。那是因为你对这个知识还是有一点的基础了解的,这样你才不会一点头绪都没有去寻找答案。但是当你遇到一个完全陌生的需求,你根本不知道该用android什么技术去实现它。这时候你就慌了,其实是你没去接触到这个知识领域。我说这话的目的就是我们对于一些开发中还未接触的知识,我们需在平时有空的时候多去学习新领域,在脑海中形成一个基本的知识印象,等到真正开发实践就能够知道往哪个方向去解决问题,不会毫无方向。说了这么多的屁话,就是为了让你好好跟着我学习这边文章。

撸起袖子开始啦!注意:本编文章只是提供多线程学习的一些思路,对一些多线程知识一点都不了解的可能需要自己先去稍微学习下基本知识!

一、什么是线程,什么是进程?

说白了,进程就是我们手机上的一个软件,像我们的微信这个软件,这个就是一个进程。那什么又是线程呢?线程就是进程里面的一个最小调度单位,就像是微信里面的一个任务,像你正在和MM聊天,这个任务就是一个线程。懂了吧!

官方解释就是:一个基本的CPU执行单元 & 程序执行流的最小单元
1.比进程更小的可独立运行的基本单位,可理解为:轻量级进程
2.组成:线程ID + 程序计数器 + 寄存器集合 + 堆栈
3.注:线程自己不拥有系统资源,与其他线程共享进程所拥有的全部资源。

二、线程之间的状态转换

重点理解就绪、运行和阻塞三个状态

线程状态转换.png

三、 线程分类

线程主要分为:守护线程、非守护线程(用户线程)

3.1 守护线程

定义:守护用户线程的线程,即在程序运行时为其他线程提供一种通用服务
常见:如 垃圾回收线程

设置方式:
//设置该线程为守护线程
thread.setDaemon(true);
3.2 非守护线程(用户线程)

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

a. 主线程(UI线程)

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

b. 子线程(工作线程)

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

3.3 守护线程 与 非守护线程的区别
区别:虚拟机是否已退出:

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

4.多线程引入

4.1 定义

多个线程同时进行,即多个任务同时进行

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

4.2 作用

Android官方声明:在多线程编程时有两大原则:

1.不要阻塞UI线程(即主线程):单线程会导致主线程阻塞,然后出现ANR错误:主线程被阻塞超过5s则会出现错误
2.不要在UI线程之外更新UI组件
所以,我们需要多线程(1个主线程+x个工作线程)来解决上述两个问题:

1)将耗时任务放在工作线程中进行

对应原则:不要阻塞UI线程(即主线程),即当我们有耗时的任务,如果在UI线程中执行,那就会阻塞UI线程了,必须要抛到工作线程中去执行;

2)将更新UI组件放在主线程中进行

对应原则:不要在UI线程之外访问UI组件,即更新UI组件时,一定得在UI线程里执行,故需要在工作线程中执行的任务结果返回到UI线程中去更新组件

五、常见的创建多线程的四种方式

1.继承Thread类

public static void main(String[] args) {
        Thread mThread=new MyThread();
        mThread.start();
    }

public static class MyThread extends Thread{

        @Override
        public void run() {
            System.out.println("");
        }
    }

2.实现Runable接口

public static void main(String[] args) {
        Thread mThread=new Thread(new MyRunnable());
        mThread.start();
    }

public static class MyRunnable implements Runnable {

        @Override
        public void run() {
            System.out.println("");
        }
    }

3.实现callable接口(区别:含返回值)

okhttp源码中把请求添加到等待队列和运行队列就是实现了callable接口的线程

FutureTask<String> task=new FutureTask<>(new Callable<String>() {
            @Override
            public String call() throws Exception {
                System.out.println(Thread.currentThread().getName());
                return "done";
            }
        });

        new Thread(task).start();

4.使用线程池

Executors.newCachedThreadPool().submit(new Runnable() {
            @Override
            public void run() {
                System.out.println("doing something");
            }
        });

这篇文章主要介绍一下关于多线程的基本概念,这只是预热,下面我们学习多线程的并发知识,下一篇《带你从头到脚学习多线程3--并发篇》https://www.jianshu.com/p/c4731687930c

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