android thread实例

android HandlerThread 实例 android HandlerThread 实例,介绍HandlerThread的实现方法。HandlerThread使用很方便,主要用于需要常驻在程序的线程。 立即下载

本文转载自http://blog.youkuaiyun.com/z496844387/article/details/6412507


创建线程的方法:

官网的说法:

There are basically two main ways of having a Thread execute application code. 
One is providing a new class that extends Thread and overriding its run() method. 
The other is providing a new Thread instance with a Runnable object during its creation. In both cases, the start() method must be called to actually execute the new Thread.

扩展Thread的示例代码:

public class CommonTestActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        new Thread(){
        	public void run(){
        		System.out.println("Thread is running.");
        	}
        }.start();
    }
}

使用Runnable的示例代码:

public class CommonTestActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        new Thread(r).start();
    }
    
    Runnable r = new Runnable() {
        @Override
        public void run() {        	
            System.out.println("Runnable running ");
        }
    };
    
}

经典实例:

多个窗口一起卖火车票问题。假设有3个窗口同时售票,共有10张火车票代售。启动三个线程卖共同的10张票。

1. 使用下面的代码试图实现功能

public class CommonTestActivity extends Activity{
	
	private Button mybutton;
	private TextView mytext;

	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		mybutton = (Button) findViewById(R.id.button);
		mytext = (TextView) findViewById(R.id.text);
		
        mybutton.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
		        MyThread myThread1 = new MyThread(); 
		        MyThread myThread2= new MyThread(); 
		        MyThread myThread3 = new MyThread(); 
		        myThread1.start(); 
		        myThread2.start(); 
		        myThread3.start(); 
			}
        });
       
	}

	class MyThread extends Thread {
		private int tickets = 10;

		public void run() {
			for (int i = 0; i < 200; i++) {
				if (tickets > 0) {
					System.out.println(Thread.currentThread().getName() + "==>"
							+ tickets--);
				}
			}
		}
	}

}
输出如下

11-17 22:45:01.234: I/System.out(672): Thread-10==>10
11-17 22:45:01.234: I/System.out(672): Thread-10==>9
11-17 22:45:01.234: I/System.out(672): Thread-10==>8
11-17 22:45:01.234: I/System.out(672): Thread-10==>7
11-17 22:45:01.234: I/System.out(672): Thread-10==>6
11-17 22:45:01.234: I/System.out(672): Thread-10==>5
11-17 22:45:01.234: I/System.out(672): Thread-10==>4
11-17 22:45:01.234: I/System.out(672): Thread-10==>3
11-17 22:45:01.244: I/System.out(672): Thread-10==>2
11-17 22:45:01.244: I/System.out(672): Thread-10==>1
11-17 22:45:01.244: I/System.out(672): Thread-11==>10
11-17 22:45:01.244: I/System.out(672): Thread-11==>9
11-17 22:45:01.244: I/System.out(672): Thread-11==>8
11-17 22:45:01.244: I/System.out(672): Thread-11==>7
11-17 22:45:01.244: I/System.out(672): Thread-11==>6
11-17 22:45:01.254: I/System.out(672): Thread-11==>5
11-17 22:45:01.254: I/System.out(672): Thread-11==>4
11-17 22:45:01.254: I/System.out(672): Thread-11==>3
11-17 22:45:01.254: I/System.out(672): Thread-11==>2
11-17 22:45:01.254: I/System.out(672): Thread-11==>1
11-17 22:45:01.264: I/System.out(672): Thread-12==>10
11-17 22:45:01.264: I/System.out(672): Thread-12==>9
11-17 22:45:01.264: I/System.out(672): Thread-12==>8
11-17 22:45:01.264: I/System.out(672): Thread-12==>7
11-17 22:45:01.264: I/System.out(672): Thread-12==>6
11-17 22:45:01.274: I/System.out(672): Thread-12==>5
11-17 22:45:01.274: I/System.out(672): Thread-12==>4
11-17 22:45:01.274: I/System.out(672): Thread-12==>3
11-17 22:45:01.274: I/System.out(672): Thread-12==>2
11-17 22:45:01.274: I/System.out(672): Thread-12==>1

分析:

运行结果与预期不一致,分析可以看出3个线程各种卖各自的10张票,而不是共同的10张票。

在上面的代码中,只能保证:每个线程都将启动,每个线程都将运行直到完成。一系列线程以某种顺序启动并不意味着将按该顺序执行。对于任何一组启动的线程来说,调度程序不能保证其执行次序,持续时间也无法保证。


2. 只修改onClick里面的代码,并分析运行结果

public void onClick(View v) { 
    //实例化线程对象 
    MyThread myThread = new MyThread(); 
    new Thread(myThread, "窗口1").start(); 
    new Thread(myThread, "窗口2").start(); 
    new Thread(myThread, "窗口3").start(); 
}

输出如下

11-17 22:49:17.314: I/System.out(708): 窗口1==>10
11-17 22:49:17.314: I/System.out(708): 窗口1==>9
11-17 22:49:17.314: I/System.out(708): 窗口1==>8
11-17 22:49:17.314: I/System.out(708): 窗口1==>7
11-17 22:49:17.314: I/System.out(708): 窗口1==>6
11-17 22:49:17.324: I/System.out(708): 窗口1==>5
11-17 22:49:17.324: I/System.out(708): 窗口1==>4
11-17 22:49:17.324: I/System.out(708): 窗口1==>3
11-17 22:49:17.324: I/System.out(708): 窗口1==>2
11-17 22:49:17.324: I/System.out(708): 窗口1==>1

分析:

我认为此处3个窗口已经是在卖共同的10张票了,只不过由于没有进行线程同步才造成数据混乱。

线程的同步是为了防止多个线程访问一个数据对象时,对数据造成的破坏。

3. 下面继续修改代码,验证我刚得猜测。

public void onClick(View v) { 
    //实例化线程对象 
    MyThread myThread = new MyThread(); 
    new Thread(myThread, "窗口1").start(); 
    new Thread(myThread, "窗口2").start(); 
    new Thread(myThread, "窗口3").start(); 
}

class MyThread extends Thread{ 
    private int tickets = 10; 
    public void run() { 
        for(int i = 0; i< 200; i++){ 
                sell(); 
        } 
    } 
    public synchronized  void sell(){ 
            if(tickets > 0) 
            { 
                System.out.println(Thread.currentThread().getName() + "==>" + tickets--); 
            } 
    } 
}

运行结果:

05-11 08:53:31.986: INFO/System.out(7116): 窗口1==>10 
05-11 08:53:32.006: INFO/System.out(7116): 窗口1==>9 
05-11 08:53:32.016: INFO/System.out(7116): 窗口1==>8 
05-11 08:53:32.066: INFO/System.out(7116): 窗口1==>7 
05-11 08:53:32.086: INFO/System.out(7116): 窗口1==>6 
05-11 08:53:32.106: INFO/System.out(7116): 窗口1==>5 
05-11 08:53:32.106: INFO/System.out(7116): 窗口1==>4 
05-11 08:53:32.126: INFO/System.out(7116): 窗口1==>3 
05-11 08:53:32.146: INFO/System.out(7116): 窗口1==>2 
05-11 08:53:32.146: INFO/System.out(7116): 窗口1==>1

分析:

一个对象只有一个锁。所以,如果一个线程获得该锁,就没有其他线程可以获得锁,直到第一个线程释放(或返回)锁。这也意味着任何其他线程都不能进入该对象上的synchronized方法或代码块,直到该锁被释放。

释放锁是指持锁线程退出了synchronized同步方法或代码块。

上述代码没有Thread.sleep(10),换句话说线程一一直处于运行状态,没有释放锁,没有给其他线程运行的机会。

4. 根据上述分析,修改代码如下:

public void onClick(View v) { 
        //实例化线程对象 
        MyThread myThread = new MyThread(); 
        new Thread(myThread, "窗口1").start(); 
        new Thread(myThread, "窗口2").start(); 
        new Thread(myThread, "窗口3").start(); 
    } 
    class MyThread extends Thread{ 
        private int tickets = 10; 
        public void run() { 
            for(int i = 0; i< 200; i++){ 
                try{ 
                    sell(); 
                    Thread.sleep(10); 
                }catch (InterruptedException e) { 
                    System.out.println("我被打断了" + Thread.currentThread().getName()); 
                    e.printStackTrace(); 
                }

            } 
        } 
        public synchronized  void sell(){ 
                if(tickets > 0) 
                { 
                    System.out.println(Thread.currentThread().getName() + "==>" + tickets--); 
                } 
        } 
    }

运行结果:

05-11 09:17:07.496: INFO/System.out(7898): 窗口1==>10 
05-11 09:17:07.528: INFO/System.out(7898): 窗口1==>9 
05-11 09:17:07.546: INFO/System.out(7898): 窗口1==>8 
05-11 09:17:07.577: INFO/System.out(7898): 窗口1==>7 
05-11 09:17:07.626: INFO/System.out(7898): 窗口3==>6 
05-11 09:17:07.626: INFO/System.out(7898): 窗口2==>5 
05-11 09:17:07.636: INFO/System.out(7898): 窗口1==>4 
05-11 09:17:07.646: INFO/System.out(7898): 窗口2==>3 
05-11 09:17:07.646: INFO/System.out(7898): 窗口1==>2 
05-11 09:17:07.656: INFO/System.out(7898): 窗口3==>1

分析:

此次得出的正是我们想要的结果!O(∩_∩)O~


Android 线程thread的两种实现方法(必看) 这篇文章中有三点需要提前说明一下, 一:在android中有两种实现线程thread的方法: 一种是,扩展java.lang.Thread类 另一种是,实现Runnable接口 二:Thread类代表线程类,它的两个最主要的方法是: run()——包含线程运行时所执行的代码 Start()——用于启动线程 三: Handler 机制,它是Runnable和Activity交互的桥梁,在run方法中发送Message,在Handler里,通过不同的Message执行不同的任务。 下面分别给出两种线程的实现方法,其一,扩展java.lang.Thread类,也就是把run()方法写到线程里面: 立即下载

相关推荐

ESP32固定翼航模硬件设计与飞行力学解析

固定翼无人机是嵌入式控制与空气动力学交叉实践的经典载体,其飞行稳定性本质源于重心、气动中心与控制面的物理耦合关系。理解静稳定度(Static Margin)、升力系数调控、偏航力矩生成等基础原理,是实现可靠姿态控制的前提。在低成本工程约束下,材料刚度、结构弹性与电机-驱动协同设计共同决定了系统动态响应边界。ESP32平台凭借高精度PWM、低功耗双模无线及丰富GPIO,成为教学级航模开发的理想主控;而魔术贴基板、可调电池配重、柔性尾翼等创新结构,则将抽象的飞行力学概念转化为可测量、可调试的实体对象,广泛应用于

weixin_29859471的博客 365

Android中线程Thread的使用

定义 主线程是指进程拥有的线程,或叫UI线程,Java中默认情况下一个进程只有一个线程,这个线程就是主线程。主线程不能执行耗时的任务,所以在一些耗时处理时,就得使用子线程。Android沿用了Java的线程模型,从Android3.0开始系统要求网络访问也必须在子线程中进行,否则网络访问将会失败并抛出NetworkOnMainThreadException异常。在Android里如果主线程被执行...

子云心的博客 7630

SDN:使用Postman控制ODL查看和下发流表

所谓,其实可被视作是SDN对网络设备的数据转发功能的一种抽象。在传统网络设备中,交换机和路由器的数据转发需要依赖设备中保存的二层MAC地址转发表或者三层的IP地址路由表,SDN交换机中使用的流表也是如此,不过在它的表项中整合了网络中各个层次的网络配置信息,从而在进行数据转发时可以使用更丰富的规则。其流表中的每个表项结果如下图所示:OpenFlow1.3流表的每个表项由6部分组成:1、匹配域:匹配域即OpenFlow1.0流表中的包头域,用于对交换机接收到的数据包的包头内容进行匹配。Ehter Des。

lyhaoyuhangyuan的博客 2535

学习Android(十二)Thread

Android 应用的 UI 操作在主线程执行,若在主线程中执行耗时任务会导致界面卡顿甚至应用无响应(ANR)。因此,耗时任务应在子线程中执行,并通过合适的通信机制将结果回传给主线程。Android 提供了多种线程管理工具,如 Thread、HandlerThread 和 ExecutorService(线程池),以简化异步编程。 Thread 是最基础的线程类,通过 start() 启动线程,run() 为线程执行入口。HandlerThread 继承自 Thread,内部自动创建 Looper 和消息队

m0_56334538的博客 1395

ADS 使用调整器动态调参教程(Tuning)

ADS动态调参教程

weixin_42845306的博客 1万+

OpenOCD入门到精通:第 4 章 配置文件体系详解

本文深入解析OpenOCD配置文件的体系结构和工作机制。首先介绍了配置文件的搜索路径优先级和加载顺序,以及配置阶段与运行阶段的区别。然后详细分析了interface配置文件的适配器参数调优方法,包括ST-Link、CMSIS-DAP和FTDI等常见调试器的配置示例。最后重点讲解了target配置文件的核心结构,包括TAP声明、目标创建和工作区设置等关键步骤,并以stm32f1x为例展示了完整的配置流程。通过本文可以全面了解OpenOCD配置文件的分层设计理念和参数化配置方法。

从事嵌入式linux android驱动开发,拥有全栈能力 594

Android中的Thread详解

一、前言线程(英语:thread)在计算机科学中,是将进程划分为两个或多个线程(实例)或子进程,由单处理器(单线程)或多处理器(多线程)或多核处理系统并发执行。 —— 维基百科无论在Android还是java开发甚至其他语言开发,大多数都逃不过多线程的话题,当然dart等语言除外(不过也有isolate的概念)。线程是操作...

weixin_42378997的博客 797

笔试题-2023-星宸-数字IC设计【纯净题目版】

4 笔试题-2023-星宸-数字IC设计【纯净题目版】

w0shishabi的博客 1171

简单实例化解析安卓Thread线程

进程(Process)与线程(Thread)进程是某个正在执行的应用程序的执行过程,该过程包括应用程序在执行之前向操作系统(OS)申请系统资源、开始执行、整个执行过程、执行结束。从用户体验的角度上来说,若干个进程是处于“同时执行”的状态的,事实上并不是这样!操作系统会实现CPU的调度,使得CPU在多个进程之间高频率的切换,由于切换速度快,所以,从正常的视觉和听觉等感观是无法察觉的,即体验到的就是“同

leerfun的博客 1674

海思3559av100平台lan9500模块调试记录

1. 前言 通过USB2.0接口扩展一路百兆虚拟网口 2. 配置lan9500驱动 make ARCH=arm64 menuconfig 开启LAN95XX驱动,编译进内核 保存内核配置 3. 编译内核 make ARCH=arm64 CROSS_COMPILE=aarch64-himix100-linux- uImage -j 20 cd ../../arm-trusted-firmware/arm-trusted-firmware ./mk.sh cp ...

jzwjzw19900922的博客 908

《深入掌握MongoDB数据库》 - 专栏介绍和目录

本专栏系统讲解MongoDB从基础到高级的全栈知识,涵盖安装配置、核心操作、性能优化、安全运维等核心内容。基础部分包括CRUD操作、数据类型、查询语法等入门知识;进阶部分深入索引优化、聚合查询、事务处理等高级特性;核心原理解析存储引擎与数据格式;安全运维则聚焦访问控制、认证机制、审计日志等企业级实践。通过实战案例与最佳实践,帮助开发者全面掌握MongoDB在不同场景下的应用,适合各层次技术人员系统学习。

数据知道的博客 2992

android 如何extends 多个,Android多线程:继承Thread类 使用解析(含实例教程)

前言在Android开发中,多线程的使用十分常见今天,我将全面解析多线程其中一种常见用法:继承Thread类。目录示意图1. 简介示意图2. 使用讲解2.1 使用步骤示意图2.2 具体使用// 步骤1:创建线程类 (继承自Thread类)class MyThread extends Thread{// 步骤2:复写run(),内容 = 定义线程行为@Overridepublic void run(...

weixin_35908791的博客 1391

3dmax文件格式转换——.max 转换为 .flt(解决转换后.flt没有纹理贴图的问题)

本文主要介绍如何在3dmax中将.max格式文件转换为.flt格式文件,并解决转换后的文件没有纹理贴图的问题。 在3dmax中,将.max文件转换为.flt格式,只需导出选择.flt格式即可,但是导出的文件在osgEarth中加载后,缺少纹理和贴图。 下面是解决方案: 1、选中加载的模型,然后点击 渲染-> 渲染到纹理 2、将 渲染到纹理 子窗口往下拉,点击 添加 按钮,添加 ...

cchangcs 6166

android thread时间,Android Thread 介绍与实例

Android中很重要的一个机制就是线程+消息,当然线程并不是android独有的,下面,简单的说说使用线程的时候应该注意的地方我们采用最简单的方法来建立一个android的线程+消息的例子1.Thread + Handler[java]package com.example.test_thread;import android.app.Activity;import android.os.Bun...

weixin_35775778的博客 209

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

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

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Android内核之Binder通信写操作:binder_thread_write用法实例(七十一)

本篇目的:Android内核之Binder通信写操作:binder_thread_write用法实例函数是Android内核中用于Binder线程通信的关键函数之一。Binder是Android系统中用于进程间通信(IPC)的机制,它通过驱动程序实现。在Binder机制中,每个进程都有一个专门的Binder线程,用于处理与其他进程的通信请求。函数主要负责向目标Binder线程发送消息。

Android系统攻城狮 1412

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Android Handler和Thread实例及Timer()延时

Android对UI的处理需要放在Activity主线程去处理,因此对UI的操作不能在新建的Thread中处理 因此,采用Handler机制实现,以更新当前时间为例: 1,采用Thread方式处理 首先新建Handler: Handler m_handler; static final int m_what = 100000; m_handler=new Handler(){ @Over

lzmax的专栏 1420

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Android 不可缺少的异步(Thread、Handler、AsyncTask)实例解析(在独立线程中进行地理位置编码)

很多初入Android或Java开发的新手(我也在内)对Thread、Looper、Handler和Message仍然比较迷惑,衍生的有HandlerThread、java.util.concurrent、Task、AsyncTask由于目前市面上的书籍等资料都没有谈到这些问题,

qiannuo的专栏 1850

Android多线程:继承Thread类、实现Runnable接口使用教程(含实例讲解)

前言 在Android开发中,多线程的使用十分常见 今天,我将全面解析多线程中最常见的2种用法:继承Thread类 &amp;amp; 实现Runnable接口 含丰富的实例讲解,切记不能错过。 Part 1:继承Thread类 目录 1. 简介 2. 使用讲解 2.1 使用步骤 2.2 具体使用 ...

Carson带你学Android 1万+

Android内核之Binder通信读操作:binder_thread_read用法实例(七十二)

本篇目的:Android内核之Binder通信读操作:binder_thread_read用法实例在 Android 操作系统中,Binder 驱动是用于进程间通信(IPC)的核心组件,负责在不同的应用程序之间传递消息和数据。在这个驱动中,函数起着至关重要的作用,它是负责从 Binder 队列中读取消息的关键部分。首先,理解 Binder 的基本工作原理是很重要的。当一个应用程序(或者 Android 系统的其他组件)想要向另一个应用程序发送消息时,它会将消息发送到 Binder 驱动中的队列中。而。

Android系统攻城狮 1361

关于 Android Handler 跟 Thread 通信交互的小实例,配备了 Demo 供初学/新手小伙伴参考

Android Handler 跟 Thread 通信

Engineer-Jsp的专栏 1883

Android线程封装基类Thread

Android对Linux线程提供了C++封装Thread类,它是线程的基类。使用Thread类,需创建一个新类继承于Thread类,并实现threadLoop()方法,它即是线程函数。要启动线程,调用run()函数即可。    /*  * Android线程封装的基类  */ class Thread : virtual publ

chujidiy的专栏 1204
上一篇: 在Android中使用Handler和Thread线程执行后台操作
下一篇: 好博文索引(持续更新)
awebkit
博客等级 码龄16年 105粉丝 56原创
评论 10
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值