Android开发之路多线程
前言
多线程作为Android开发中相对而言较为高阶的知识,其中用到相关的知识点是非常的多,所以在我们需要进行设计或者写多线程的代码就必须要进行相对谨慎的处理,这样就由必要对其要有着比较系统化的认知 Android多线程机制
我们一般将Android应用分成为两种:主线程和工作线程;主线程主要是用来进行初始化UI,而工作线程主要是进行耗时操作,例如读取数据库,网络连接等
Android系统是以进程为单位来对应用程序资源进行限制,这个问题的可以解释为:一个进程最多能够开几个线程?最好能开几个?但实则这个是没有上限这一说,主要是因为资源的限制
Android中关于主线程的理解:Android的主线程是UI线程,在Android中,四大组件运行在主线程中,在主线程中做耗时操作会导致程序出现卡顿甚至出现ANR异常,一个.
在一个程序中,这些独立运行的程序片断叫作"线程"(Thread),利用它编程的概念就叫作"多线程处理"。多线程处理一个常见的例子就是用户界面。 多线程基础
线程总的来就是进程的一个实体,是CPU进行分派和调度的基本单位,拥有着比进程更小且能够独立运行的基本单位,线程本身基本上是不拥有系统资源,仅拥有一点在运行过程中必须拥有的资源,但它可与同属一个进程中的其他进程进行共享其所拥有的所有资源
线程状态
线程状态有些地方将之分为5中状态,而且在Java Jdk中线程被其定义为6中状态,我们可以对其进行类比
普遍定义的5中状态:新建,就绪,运行,阻塞, 死亡
Java Jdk 定义状态 线程阻塞
线程阻塞是指在某一时刻的某一个线程在进行运行一段代码的情况下,突然另一个线程也要进行运行,但在运行过程中,那个线程执行完全运行之前,另一个线程是不可能获取到CPU的执行权,就会导致线路阻塞的出现
死锁
死锁也称之为抱死,意思就是说一个进程锁定了另外一个进程所需要的页或表是,但第二个进程同时又锁定了第一个进程所需的一页,这样就会出现死锁现象
使用代码实现死锁public class DeadLock implements Runnable{ private int flag; // 注意... 这里对象必须是static类型的,保证锁住的是同一个对象 private static final Object object1 = new Object(); private static final Object object2 = new Object(); public DeadLock(int flag) { this.flag = flag; } @Override public void run(){ if (flag == 1){ synchronized (object1){ System.out.println("持有对象object1的锁,等待持有object2锁释放资源"); try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } synchronized (object2){ System.out.println("程序结束"); } } } if (flag == 2){ synchronized (object2){ System.out.println("持有对象object2的锁,等待持有object1锁释放资源"); try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } synchronized (object1){ System.out.println("程序结束"); } } } } }public class Client { public static void main(String[] args){ new Thread(new DeadLock(1)).start(); new Thread(new DeadLock(2)).start(); //持有对象object1的锁,等待持有object2锁释放资源 //持有对象object2的锁,等待持有object1锁释放资源 // .......程序一直运行....... } }线程使用
创建线程
简要介绍实现线程的三种方式:继承Thread,实现runnable,实现callable。这里有一点需要注意的是,实现callable是与线程池相关联的而callable很重要的一个特性是其带有返回值。当我们只需实现单线程时实现runnable更加利于线程程序的拓展 public class HappyThread extends Thread { @Override public void run() { super.run(); System.out.println("继承Thread"); } } public class JobRunnable implements Runnable { @Override public void run() { try { Thread.sleep(1000); System.out.println("实现runnable实现线程"); } catch (InterruptedException e) { e.printStackTrace(); } } } public class EnjoyCallable implements Callable { @Override public String call() throws Exception { Thread.sleep(2000); return "实现callable实现线程池"; } } public class Client { public static void main(String[] args){ // 继承thread实现线程 new HappyThread().start(); // runnable 与 线程 new Thread(new JobRunnable()).start(); // callable 与 线程池 // 包含返回值 ExecutorService executorService = Executors.newCachedThreadPool(); Future submit = executorService.submit(new EnjoyCallable()); try { System.out.println(submit.get()); submit.cancel(true); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } } //继承Thread // ** 1s后 ** //实现runnable实现线程 // ** 2秒后 ** //实现callable实现线程池 }守护线程
在线程开启之前进行调用 thread.setDaemon(true); 将thread设定成当前线程中的守护线程 使用案例 public class DaemonThreadClient { public static void main(String[] args) throws InterruptedException { Thread thread = new DaemonThread(); thread.setDaemon(true); thread.start(); Thread.sleep(20); System.out.println("主线程结束"); } } class DaemonThread extends Thread{ @Override public void run() { while (true){ try { Thread.sleep(5); System.out.println("守护线程运行中"); } catch (InterruptedException e) { e.printStackTrace(); } } } } //output //守护线程运行中 //守护线程运行中 //守护线程运行中 //守护线程运行中 //主线程结束 //Process finished with exit code 0yield线程让步与join合并等待线程结束
线程让步【yield方法】让当前线程释放CPU资源,让其他线程抢占 public class YieldClient { public static void main(String[] args){ new ThreadA().start(); new ThreadB().start(); } } class ThreadA extends Thread{ public ThreadA(){ setPriority(2); } @Override public void run() { yield(); for (int i=0;i<10;i++){ System.out.println("ThreadA 低优先级的运行"); } } } class ThreadB extends Thread{ public ThreadB(){ setPriority(8); } @Override public void run() { for (int i=0;i<10;i++){ System.out.println("ThreadB 高优先级的运行"); } } } // output // ThreadB 高优先级的运行 // ... // ThreadB 高优先级的运行 // ThreadA 低优先级的运行 // ThreadA 低优先级的运行 // ThreadA 低优先级的运行 // ThreadA 低优先级的运行 // ... // ThreadA 低优先级的运行 // ThreadA 低优先级的运行 // Process finished with exit code 0线程阻塞等待但不会释放锁资源public class JoinClient { public static void main(String[] args) throws InterruptedException { JoinAThread joinAThread = new JoinAThread(); joinAThread.start(); joinAThread.join(); System.out.println("主线程 开始"); Thread.sleep(10); System.out.println("主线程 运行中"); Thread.sleep(10); System.out.println("主线程 运行中"); System.out.println("主线程 结束"); } } class JoinAThread extends Thread{ @Override public void run() { super.run(); try { System.out.println("JoinAThread 开始"); Thread.sleep(30); System.out.println("JoinAThread 运行中"); Thread.sleep(30); System.out.println("JoinAThread 运行中"); System.out.println("JoinAThread 结束"); } catch (InterruptedException e) { e.printStackTrace(); } } } //output //JoinAThread 开始 //JoinAThread 运行中 //JoinAThread 运行中 //JoinAThread 结束 //主线程 开始 //主线程 运行中 //主线程 运行中 //主线程 结束 // //Process finished with exit code 0线程终止public class InterruptClient { public static void main(String[] args){ new InterruptThread().start(); } } class InterruptThread extends Thread{ @Override public void run() { super.run(); for (int i=0;i<10;i++){ if (isInterrupted()){ System.out.println("线程打断而结束"); return; } System.out.println("线程执行..."+i); if (i == 2){ // 终止线程 interrupt(); } } } } //output //线程执行...0 //线程执行...1 //线程执行...2 //线程打断而结束 // //Process finished with exit code 0线程关键知识点
Java中的sleep与wait区别/** * 测试 sleep 和 wait 区别 */ public class Client { public static void main(String[] args) throws InterruptedException { Product product = new Product(); new Thread(new ChildSetRunnable(product),"set thread").start(); // 主线程睡眠,保证获取线程晚于设置线程的执行 Thread.sleep(500); new Thread(new ChildGetRunnable(product),"get thread").start(); } }public class ChildGetRunnable implements Runnable { private Product product; public ChildGetRunnable(Product product) { this.product = product; } @Override public void run() { // 运行加锁 System.out.println(Thread.currentThread().getName()+" run()"); synchronized (product){ System.out.println(Thread.currentThread().getName()+" "+System.currentTimeMillis()+" 读取价格 = "+product.getPrice()); } } }public class ChildSetRunnable implements Runnable { private Product product; public ChildSetRunnable(Product product) { this.product = product; } @Override public void run() { System.out.println(Thread.currentThread().getName()+" run()"); synchronized (product){ try { System.out.println(Thread.currentThread().getName()+" "+System.currentTimeMillis()+" 设置价格= 100 开始"); /** * 1.测试sleep 释放CPU时间片,但仍然持有对product的锁资源 */ Thread.sleep(3000); /** * 2.测试wait 释放CPU时间片,但是会释放锁资源 */ //product.wait(3000); product.setPrice("100"); System.out.println(Thread.currentThread().getName()+" "+System.currentTimeMillis()+" 设置价格= 100 结束"); } catch (InterruptedException e) { e.printStackTrace(); } } } }
这种具体某个对象锁 wait & notify 方法与Condition 的 await以及signal方法类似; 全面这种方法的阻塞等待都可以是释放锁,而且在唤醒后,这种线程都是能够获取锁资源的,而这个门栓就跟阀门类似 结语
今天的课程就到这里了,有需要文章中所涉及到的源码可以点击下方评论区留言或者点击我的头像私信我
华为能否彻底离开美国技术?注意是美国技术?除非说你准备回到原始社会,要不然的话,谁都不能彻底离开美国技术。别的不说了,就说咱们日常中需要用到的电吧!咱们用的电,不是交流电就是直流电,但无论是交流电还是直流电,其技术发明者都
iPhone13的卫星功能只会在部分特定市场上提供上周,分析师郭明錤表示,苹果将在iPhone13上支持LEO卫星通信,然后,彭博社的MarkGurman给出了更多关于这一功能及其实现的细节。现在,在他的PowerOn时事通讯中,
元宇宙这场美梦,万一实现了呢?布道者2014年,扎克伯格试用Rift原型机后没再犹豫,用股权凑齐20亿美金收购了提供商Oculus7年后,张一鸣挥手90亿收购VR头盔提供商PICO,宣布字节入局与字节竞价失败的
宇宙中的物质从哪里来?宇宙中的恒星宇宙是时间空间物质与能量的集合体。宇宙由68的暗能量27的暗物质和5的可见物质组成。现在宇宙中有上千亿个星系,每个星系又有1000亿至4000亿颗恒星,可以形象地说,地
假如太阳停止发光发热,人类的时间就只剩下八分钟了吗?如果太阳突然停止发光发热,地球上的人类会在大约8分20秒后才会感知到。地球与太阳的间相隔为一个天文单位,其具体的距离大约为15000万公里,而光在真空中的传播速度大约30万公里秒。
人死后48小时内会有哪些变化?活着的时候,人一辈子都在为自己打算,出门穿什么衣服,午饭吃什么,晚上去哪里玩,要买什么样的房子车子,过什么样的生活。那当人体死亡后,你会面临什么,很少有人关注。人们常说的一句话就是
如果一个人尿在通电的插排上,会不会触电而亡?如果一个人尿在通电的插排上,会不会被电死?男生尿尿都喜欢瞄准一个物体尿尿,所以就发生了有趣的故事,记得某次看过一个非常有趣的事情,说的是某学校的学生都都喜欢对着隔壁公司的一根自来水
该如何解释美国专家质疑阿波罗11登月真实性这件事?假的真不了。那些质疑者提出的疑问都极具科学性和常识性,而那些保真的人回答都莫衷一是,模棱两可的胡言乱语。总的来说,质疑者证据确凿,思维清晰,言语有力。而那些认定美国登月是真的那群人
你手机里有哪些堪称神器的App?1。日程管理时光序支持根据艾宾浩斯遗忘曲线设置日程,被家长学生誉为辅助学习超级功能。学习某个知识点后,可自动按照1天2天4天7天15天的规律生成日程,然后再桌面日期界面显示。科学学
听说华强北有人在二手iPhone里安装监控芯片,请问是真的吗?像你这种银行卡余额3。8元的,他监控你干啥你给我说说假的,首先,监控个电压什么的还可信,但是监控IOS这样的操作系统,并不是一个芯片就能解决的,它首先需要几个要素,最重要的是芯片,
平时在家里听听音乐,不是发烧级别的,哪个牌子的音箱比较好?本人购买过很多音响,在这发表点意见,仅供参考,如有不同意见欢迎指正。关于购买音响,我的建议是你要去听,一般好点的品牌都可以试听的。可以让音响店老板给你放些试音音乐,比如加州旅馆,渡
华为手机2022年04月08日新消息华为手机华为手机2022年04月08日新消息现在买苹果手机的人多还是买华为手机的人多?麦芒9手机是华为的吗华为p50pro手机参数华为P50Pro优缺点对比使用过后真实感受华为P4
马斯克为什么喜欢花钱买失败?文深途(shentucar),作者周继凤,编辑黎明作为这个星球最爱发推特的人之一,同时,也是频频表达对推特现有机制不满的人埃隆马斯克,最近展现出了首富应有的风采喜欢什么就买下什么。
不下载APP就不给看?工信部这类APP要整改想要浏览链接,却遭遇不下载APP(移动应用)就不给看愿意下载还不行,APP又要求获取定位摄像和录音等权限近日,针对部分网站在用户浏览页面信息时强制要求下载APP等问题,工业和信息化
Meta正在开发元宇宙虚拟货币扎克币文福布斯中国Facebook母公司Meta正准备计划将虚拟代币和加密货币引入其应用,目的是使用这些虚拟代币奖励创作者,或用于贷款和其他金融服务。如果得以实施,意味着META距离扎克
贝叶斯定理厉害在哪里?贝叶斯定理太有用了,不管是在投资领域,还是机器学习,或是日常生活中几乎都在用到它。例如,生命科学家用贝叶斯定理研究基因是如何被控制的教育学家意识到,学生的学习过程其实就是贝叶斯法则
无偿捐1000亿,不做首富做首善,41岁激流勇退的黄峥成就传奇衣食住行都离不开钱,这无疑不是证明的金钱的重要性。但是现实生活中就有这样一个人,他毅然决然地放弃了首富之外,向公益巨款1000亿人民币。他的一生是传奇的,曾在二十六岁时同巴菲特进餐
华为商务旗舰mate20Pro,为什么到现在还有很多人舍不得换机今天收到一台华为mate20Pro,这可是曾经的华为商务旗舰产品,是在2018年10月发布的,外观采用的是6。39英寸刘海屏设计,分辨率是前置1颗2400万摄像头和配备3D结构光功
如何根据参数选择电脑显示器我们在选择显示器时会面临很多的显示器参数,设计方面色域覆盖色彩模式色准色差色深分辨率对比度亮度均匀度接口支架表现可视角度等游戏方面尺寸分辨率刷新率对比度HDR表现防撕裂技术等面对如
Win10KMS激活失败Win10数字权利激活通知错误解决办法Windows10是微软比较成功的一个操作系统版本,安全性上有显著提高,但是在用户注册上管理严格,在当初推广时,在Win7里有一些平台可以自动升级Win10,升级后也能用,现在快速
苹果IOS15。5beta反馈看到老铁们都升级了IOS15。5beta版本,今天我也在IT之家下载描述性文件升级了一下,使用后感觉如下1。掉电速度变慢了一些,续航应该有一定的提升2。打开APP更快了,比iOS1
数字藏品是什么数字藏品的观点,基于区块链的艺术品发行,说实话,话题本身很好,故事很新颖。背后的故事将是互联网时代的创新,但赚钱的却是少数人,继续割韭菜的大多数人。数字藏品是最容易被一夜暴富的人所