Android开发之多线程编程Thread和Runnable使用

今天,我们细说Android下的多线程 多线程是开发人员必不可少的技术点,也是初学者不太容易掌握好的一个难点。要想设计出优秀的程序,那必然需要合理的线程调度。今天就给大家细说下Android中与多线程相关的知识点,揭开多线程神秘的面纱。 本篇文章仅介绍多线程的各种实现方式,不过多涉及深入的基础原理探究,达到“所见及所学,所学及可用”的效果。关于各种多线程原理的深入探究,笔者会放在后面的专栏逐一介绍。 一、多线程是什么?我为什么要用多线程... 阅读详情
 

From:http://blog.youkuaiyun.com/mad1989/article/details/38234759

Android可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口;前者只要继承了Thread类同时覆写了本类中的run()方法就可以实现多线程操作了,但是Java中一个类只能继承一个父类,这是这种方式的局限性,后者只需要实现一个接口而已,Java中可以实现多个接口。



继承Thread类

[java]  view plain  copy
  1. package com.vixtel.tools;  
  2.   
  3.   
  4. /** 
  5.  * @author yangxiaolong 
  6.  * @2014-7-28 
  7.  */  
  8. public class SyncThread extends Thread {  
  9.   
  10.     @Override  
  11.     public void run() {  
  12.         synchronized (this) {  
  13.             for (int i = 0; i < 5; i++) {  
  14.                 System.out.println(Thread.currentThread().getName()  
  15.                         + "   synchronizedloop " + i);  
  16.             }  
  17.   
  18.         }  
  19.   
  20.     }  
  21.   
  22. }  

运行:

[java]  view plain  copy
  1. SyncThread st1 = new SyncThread();  
  2. SyncThread st2 = new SyncThread();  
  3. st1.start();  
  4. st2.start();  

Runnable接口

[java]  view plain  copy
  1. package com.vixtel.tools;  
  2.   
  3.   
  4. /** 
  5.  * @author yangxiaolong 
  6.  * @2014-7-28 
  7.  */  
  8. public class SyncRunnable implements Runnable {  
  9.   
  10.     @Override  
  11.     public void run() {  
  12.         synchronized (this) {  
  13.             for (int i = 0; i < 5; i++) {  
  14.                 System.out.println(Thread.currentThread().getName()  
  15.                         + "   synchronizedloop " + i);  
  16.   
  17.             }  
  18.   
  19.         }  
  20.   
  21.     }  
  22.   
  23. }  

执行:

[java]  view plain  copy
  1. SyncRunnable sr1 = new SyncRunnable();  
  2. SyncRunnable sr2 = new SyncRunnable();  
  3.   
  4. Thread td1 = new Thread(sr1, "td1");  
  5. Thread td2 = new Thread(sr2, "td2");  
  6. //多个Thread也可以同时使用一个Runbale,  
  7. //由于多个Thread操作同一个Runnable对象,这样同步锁就需要使用了  
  8. td1.start();  
  9. td2.start();  


接下来使用经典的模拟火车卖票程序,来理解Thread和Runnable在特定场景下的区别和联系,以及synchronized在线程中的作用:

[java]  view plain  copy
  1. class AutoSaleTicket implements Runnable {  
  2.     private int ticket = 20;  
  3.   
  4.     public void run() {  
  5.   
  6.         while (true) {// 循环是指线程不停的去卖票  
  7.             // 当操作的是共享数据时,用同步代码块进行包围起来,这样在执行时,只能有一个线程执行同步代码块里面的内容  
  8.             synchronized (this) {  
  9.                 if (ticket > 0) {  
  10.   
  11.                     // 不要在同步代码块里面sleep,作用只是自已不执行,也不让线程执行  
  12.                     System.out.println(Thread.currentThread().getName()  
  13.                             + " 卖出 第 " + (20 - ticket + 1) + " 张票");  
  14.                     ticket--;  
  15.   
  16.                 } else {  
  17.                     break;  
  18.                 }  
  19.             }  
  20.             // 所以把sleep放到同步代码块的外面,这样卖完一张票就休息一会,让其他线程再卖,这样所有的线程都可以卖票  
  21.             try {  
  22.                 Thread.sleep(200);  
  23.             } catch (Exception ex) {  
  24.             }  
  25.         }  
  26.     }  
  27. }  

我们开始执行售票程序:

[java]  view plain  copy
  1. AutoSaleTicket ticket = new AutoSaleTicket();  
  2. Thread t1 = new Thread(ticket, "东城代售");  
  3. Thread t2 = new Thread(ticket, "西城代售");  
  4. Thread t3 = new Thread(ticket, "朝阳代售");  
  5. Thread t4 = new Thread(ticket, "海淀代售");  
  6. t1.start();  
  7. t2.start();  
  8. t3.start();  
  9. t4.start();  

结果:


顶
18
踩
[金仓数据库V8R6]更换授权 上传授权,使用mv license_xxx_0.dat /home/kingbase/KingbaseES/license.dat替换每个授权,并使用ls -l license.dat确保替换前后属主和权限不变。根据步骤1的数据目录位置,执行/home/kingbase/KingbaseES/Server/bin/sys_ctl -D /home/kingbase/KingbaseES/data reload使新的授权文件生效。该参数意义为授权剩余有效天数,查询结果为新授权中有效期间的天数即为替换成功。 阅读详情

相关推荐

AI医疗影像诊断工具2025 完整教程

本教程所述工具均为辅助诊断设备,不可替代执业医师判断。部署使用需遵守当地医疗器械管理法规。推荐开源框架组合:代码太多打包上传网盘了 自行下载。2025年的AI医疗影像诊断工具将以。

m0_60084632的博客 2029

Android 多线程的基本使用

Android可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口;前者只要继承了Thread类同时覆写了本类中的run()方法就可以实现多线程操作了,但是Java中一个类只能继承一个父类,这是这种方式的局限性,后者只需要实现一个接口而已,Java中可以实现多个接口。 继承Thread类 [java] view

super黑兔的博客 539

【faers数据库-R语言】

摘要:本文详细介绍了FAERS数据库不良反应信号挖掘的完整流程,包括数据解压导入(R代码示例)、数据结构理解、数据清洗(缺失值处理、标准化、合并和编码映射)、信号挖掘准备(药物-反应组合表创建)以及信号强度指标计算(PRR和ROR)。重点阐述了数据清洗的关键步骤,如缺失值处理(colSums(is.na()))、数据标准化(toupper()、as.Date())和表合并(merge()),并提供了完整的R语言实现代码。最后强调结果需结合临床知识解读,建议使用data.table等高效工具处理大数据。整个流

weixin_46587777的博客 1504

WebView开发中的常见问题

自Android 4.4起,引入了webView,使用需要注意的事项: 1.多线程 如果你在子线程中调用WebView的相关方法,而不在UI线程,则可能会出现无法预料的错误。 所以,当你的程序中需要用到多线程时候,也请使用 runOnUiThread()方法来保证你关于WebView的操作是在UI线程中进行的: runOnUiThread(newRunnable(){ @Override

伊万-张的博客 661

GD32F103实战:用ADC+DMA实现高精度多通道电压采集与OLED实时显示(附完整工程)

本文详细介绍了如何利用GD32F103的ADC+DMA技术实现高精度多通道电压采集,并通过OLED实时显示数据。文章包含硬件架构设计、ADC配置技巧、DMA传输优化及显示系统实现方案,提供完整工程代码和调试指南,适用于工业传感器和环境监测设备开发。

weixin_42567497的博客 402

【SAP】ABAP——ALV显示后选择数据操作

在ALV显示后,可全选、全不选或者选择几条数据进行发邮件、更新、下单等等操作。 在user_command中的实现方式如下: 方式一: FORM user_command USING ucomm LIKE sy-ucomm selfield TYPE slis_selfield. DATA: lr_grid TYPE REF TO cl_gui_alv_grid. DATA: lt_rows TYPE lvc_t_row WITH

Mona_1220的博客 4092

android 一个thread起多个runnable,稳扎稳打_Android开发课[10]_Thread学习

Focus on technology, enjoy life!—— QQ:804212028浏览链接:http://blog.youkuaiyun.com/y18334702058/article/details/44624305主题:Thread学习-当一个程序第一次启动时,Android会同时启动一个对应的主线程(Main Thread),主线程主要负责处理与UI相关的事件,如:用户的按键事件,用户接触...

weixin_34115768的博客 484

RTX 4060笔记本也能跑!保姆级教程:用Ollama在Windows上部署DeepSeek-R1-8B模型

本文详细介绍了如何在RTX 4060笔记本上通过Ollama本地部署DeepSeek-R1-8B模型,提供从环境配置到性能调优的全流程优化指南。针对笔记本用户的显存、散热等问题,给出了量化模型选择、启动参数优化及散热解决方案,帮助用户在消费级硬件上高效运行大语言模型。

weixin_28745067的博客 526

Thread启动线程的start方法能执行多次吗?

线程的创建 我们知道在Java里线程是通过java.lang.Thread类来实现的。一般我们创建无返回值的线程会用下面两个方法: 继承Thread类,重写run()方法; 实现Runnable接口,重写run()方法; 线程启动会通过调用start方法来启动线程而不能直接调用run方法。 这里就会引出两个经典的面试题: 为什么线程启动是调用start方法来启动线程而不能直接调用run方法? 如果多次调用start方法会发生什么? 其实答案就是源码里,在这之前我们要了解线程的状态有哪些。 线程的

归心亭 4353

用LightRAG+Ollama搭建本地知识库:从文档上传到智能问答的完整流程

本文详细介绍了如何利用LightRAG与Ollama构建企业级本地知识库,涵盖从文档预处理到智能问答的完整流程。通过实战案例展示,该方案能高效处理海量文档,实现语义搜索与知识图谱关联分析,显著提升信息检索效率。特别适合金融、医疗等领域的技术团队快速搭建智能知识管理系统。

weixin_42535461的博客 215

Vue3+Openlayers教程导航页【目录】

欢迎来到 Vue3+Openlayers 系列教程,这里是我在 优快云 编写的所有 Vue3+Openlayers 系列相关文章的索引页,适合初学者到进阶用户系统阅读。👀 更多教程正在持续更新中,欢迎关注我,一起探索 Openlayers 的强大魅力!

小彭的博客 1273

解决java Android 中同一个线程多次运行问题

在java中同一个线程只能被start()一次,当第二次start()就会报异常。但是我们的软件需求常常需要同一个线程多执行同一个方法。为此可以使用notify(),wait()方法来达到我们想要的效果。先看代码public class ThreadTest extends Thread { private static boolean flag = false; public Thr

苍穹之光 9325

揭秘AI人工智能中Stable Diffusion的模型微调技巧

Stable Diffusion作为一种强大的文本到图像生成模型,在艺术创作、设计、娱乐等多个领域展现出了巨大的应用潜力。然而,其默认的模型输出可能无法满足特定用户或特定场景的个性化需求。本文章的目的在于深入揭秘Stable Diffusion的模型微调技巧,让读者能够根据自己的需求对模型进行定制化调整,生成符合特定风格、主题或要求的图像。范围涵盖了从基础概念到实际操作,从理论原理到项目实战的全方位内容,旨在为读者提供一个系统且深入的学习指南。

大模型应用工坊 950

android开发之多线程编程Thread和Runnable使用

Android有两种方式实现多线程,一种是继承Thread类,覆写run()方法。一种是实现Runnable接口,再用该实现创建Thread。第一种方式:Java中一个类只能继承一个父类,该方式的局限性所在。package com.vixtel.tools; public class SyncThread extends Thread { @Override ...

chm880910的专栏 584

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

安卓app开发系列之-多线程编程

多线程编程是提高Android应用性能和用户体验的关键。本文介绍了Android中实现多线程的方法,包括基本的线程管理类和高效的线程池方式,以及现代Kotlin协程的使用。尽管多线程编程为开发带来了好处,但也引入了复杂性,需要开发者特别注意竞争条件、内存泄漏等问题。随着对多线程技术的深入理解,开发者能够更有效地管理应用行为,以提升用户的满意度和应用的性能。如果有进一步的问题或需要探讨的内容,请随时提出!

Jamson 1368

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Android开发中的多线程编程

多线程编程是Android开发中的一项重要技能。通过合理使用多线程,开发者可以提高应用的执行效率和响应速度。本文从多线程编程基础、实践、注意事项以及相关框架等方面详细阐述了Android开发中的多线程编程,希望对开发者有所帮助。在未来的Android开发中,多线程编程仍将是一个重要的研究方向。开发者需要不断学习和掌握新的多线程编程技术,以应对日益复杂的移动应用场景。同时,开发者也应关注线程安全和性能优化等方面的问题,以确保应用的稳定性和流畅性。

emilio15979289的博客 399

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Android高工:细说 Android 多线程,探究原理知其所以然,2024大厂安卓知识点总结

*要想成为高级安卓工程师,必须掌握许多基础的知识。**在工作中,这些原理可以极大的帮助我们理解技术,在面试中,更是可以帮助我们应对大厂面试官的刁难。《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!**由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

2401_84148942的博客 1041

Android开发笔记之:Handler Runnable与Thread的区别详解

From:http://www.jb51.net/article/37465.htm本篇文章是对在Android中Handler Runnable与Thread的区别进行了详细的分析介绍,需要的朋友参考下.在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口;Thread类是在java.lang包中定义的。一 个类只要继承了Thread...

weixin_34162695的博客 92

Handler Runnable和Thread之间的区别和联系 应用

Android开发:Handler Runnable和Thread之间的区别和联系 应用--------------------看完本篇,从此一览无余! 分类: Android开发2013-02-16 00:47 1696人阅读 评论(2) 收藏 举报 在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口;Thread类是在java....

haishizi1的专栏 180

Android高工:细说 Android 多线程,探究原理知其所以然(2)

算法知识点繁多,企业考察的题目千变万化,面对越来越近的“金九银十”,我给大家准备好了一套比较完善的学习方法,希望能帮助大家在有限的时间里尽可能系统快速的恶补算法,通过高效的学习来提高大家面试中算法模块的通过率。这一套学习资料既有文字档也有视频,里面不仅仅有关键知识点的整理,还有案例的算法相关部分的讲解,可以帮助大家更好更全面的进行学习,二者搭配起来学习效果会更好。部分资料展示:有了这套学习资料,坚持刷题一周,你就会发现自己的算法知识体系有明显的完善,离大厂Offer的距离更加近。

2401_84545908的博客 406
上一篇: android多线程编程详解,关于Handler ,Looper , Message , MessageQueue
下一篇: Android设置Activity背景为透明style
It_BeeCoder
博客等级 码龄10年 967粉丝 238原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值