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

834f336855c4

前言

在Android开发中,多线程的使用十分常见

今天,我将全面解析多线程其中一种常见用法:继承Thread类。

目录

834f336855c4

示意图

1. 简介

834f336855c4

示意图

2. 使用讲解

2.1 使用步骤

834f336855c4

示意图

2.2 具体使用

// 步骤1:创建线程类 (继承自Thread类)

class MyThread extends Thread{

// 步骤2:复写run(),内容 = 定义线程行为

@Override

public void run(){

... // 定义的线程行为

}

}

// 步骤3:创建线程对象,即 实例化线程类

MyThread mt=new MyThread(“线程名称”);

// 步骤4:通过 线程对象 控制线程的状态,如 运行、睡眠、挂起 / 停止

// 此处采用 start()开启线程

mt.start();

2.3 简便使用:匿名类

很多情况下,开发者会选择一种更加方便的方法去创建线程:匿名类

// 步骤1:采用匿名类,直接 创建 线程类的实例

new Thread("线程名称") {

// 步骤2:复写run(),内容 = 定义线程行为

@Override

public void run() {

// 步骤3:通过 线程对象 控制线程的状态,如 运行、睡眠、挂起 / 停止

}.start();

2.3 区别

2种方法本质相同,但是各有优劣势 & 不同的应用场景:

大家可根据自己的需求场景来选择具体的使用方法

834f336855c4

示意图

为了让大家理解更加深刻,下面例子我都会采用方法1 = 常规方式 来演示

3. 实例应用

实例1

应用场景:创建两个线程-实现两个相同的耗时任务

实例说明:实现2个窗口同时卖火车票;每个窗口卖100张,卖票速度都是1s/张

具体实现

main_activity.xml

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:paddingBottom="@dimen/activity_vertical_margin"

android:paddingLeft="@dimen/activity_horizontal_margin"

android:paddingRight="@dimen/activity_horizontal_margin"

android:paddingTop="@dimen/activity_vertical_margin"

tools:context="com.example.carson_ho.demoforthread.MainActivity">

//设置一个按钮用以启动卖票

android:id="@+id/button"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="点击开始卖票"

android:layout_centerInParent="true"

/>

MainActivity.java

package com.example.carson_ho.demoforthread;

import android.os.Bundle;

import android.support.v7.app.AppCompatActivity;

import android.view.View;

import android.widget.Button;

public class MainActivity extends AppCompatActivity {

//主布局中定义了一个按钮用以启动线程

Button button;

//步骤1:创建线程类,继承自Thread类

private class MyThread extends Thread{

private int ticket = 100;//一个窗口有100张票

private String name; //窗口名, 也即是线程的名字

public MyThread(String name){

this.name=name;

}

//在run方法里复写需要进行的操作

@Override

public void run(){

while (ticket>0){

ticket--;

System.out.println(name + "卖掉了1张票,剩余票数为:"+ticket);

try {

Thread.sleep(1000);//卖票速度是1s一张

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

}

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

//Button按下时会开启一个新线程执行卖票

button = (Button) findViewById(R.id.button);

button.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

//步骤2:创建线程类的实例

//创建二个线程,模拟二个窗口卖票

MyThread mt1 = new MyThread("窗口1");

MyThread mt2 = new MyThread("窗口2");

//步骤3:调用start()方法开启线程

//启动二个线程,也即是窗口,开始卖票

mt1.start();

mt2.start();

}

});

}

}

测试结果

834f336855c4

结果展示

实例2

应用场景:创建两个线程-实现两个不同的耗时任务

实例说明:实现2个窗口同时卖火车票;每个窗口卖100张,但卖票速度不同:窗口1是1s/张,窗口2是3s/张

具体实现

main_activity.xml

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:paddingBottom="@dimen/activity_vertical_margin"

android:paddingLeft="@dimen/activity_horizontal_margin"

android:paddingRight="@dimen/activity_horizontal_margin"

android:paddingTop="@dimen/activity_vertical_margin"

tools:context="com.example.carson_ho.demoforthread_2.MainActivity">

//设置一个按钮以启动卖票

android:id="@+id/button"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="点击开始卖票" />

MainActivity.java

package com.example.carson_ho.demoforthread_2;

import android.os.Bundle;

import android.support.v7.app.AppCompatActivity;

import android.view.View;

import android.widget.Button;

public class MainActivity extends AppCompatActivity {

//主布局中定义了一个按钮用以启动线程

Button button;

//步骤1:创建线程类,继承自Thread类

//因为这里需要有两个操作:一个窗口卖票速度是1s/张,一个窗口是3s/张

//所以需要创建两个Thread的子类

//第一个Thread子类实现一个窗口卖票速度是1s/张

private class MyThread1 extends Thread{

private int ticket = 100;//一个窗口有100张票

private String name; //窗口名, 也即是线程的名字

public MyThread1(String name){

this.name=name;

}

//在run方法里复写需要进行的操作:卖票速度是1s/张

@Override

public void run(){

while (ticket>0){

ticket--;

System.out.println(name + "卖掉了1张票,剩余票数为:"+ticket);

try {

Thread.sleep(1000);//卖票速度是1s一张

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

}

//第二个Thread子类实现一个窗口卖票速度是3s/张

private class MyThread2 extends Thread{

private int ticket = 100;//一个窗口有100张票

private String name; //窗口名, 也即是线程的名字

public MyThread2(String name){

this.name=name;

}

//在run方法里复写需要进行的操作:卖票速度是3s/张

@Override

public void run(){

while (ticket>0){

ticket--;

System.out.println(name + "卖掉了1张票,剩余票数为:"+ticket);

try {

Thread.sleep(3000);//卖票速度是1s一张

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

}

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

//Button按下时会开启一个新线程执行卖票

button = (Button) findViewById(R.id.button);

button.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

//步骤2:创建线程类的实例

//创建二个线程,模拟二个窗口卖票

MyThread1 mt1 = new MyThread1("窗口1");

MyThread2 mt2 = new MyThread2("窗口2");

//步骤3:调用start()方法开启线程

//启动二个线程,也即是窗口,开始卖票

mt1.start();

mt2.start();

}

});

}

}

测试结果

由于卖票速度不同,所以窗口1卖3张时,窗口2才卖1张。

834f336855c4

Thread2.png

4. 与“实现Runnable接口”对比

在Java中,继承 Thread类和实现Runnable接口是实现多线程最常用的2种方法

今天我们就来对比下这两种方法

834f336855c4

示意图

5. 总结

本文主要对多线程中继承Thread类的用法进行了全面介绍

接下来,我会继续讲解Android开发中关于多线程的知识,具体包括Runnable、Handler、HandlerThread等等,感兴趣的同学可以继续关注本人运营的Wechat Public Account:

请点赞!因为你的鼓励是我写作的最大动力!

不定期分享关于安卓开发的干货,追求短、平、快,但却不缺深度。

834f336855c4

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/365183.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

适用于Apache Hadoop 2.0 M5的Spring

Spring高兴地宣布了Spring for Apache Hadoop 2.0 M5里程碑版本,同时它们也越来越接近候选版本。 在Spring博客中 ,新版本2.0与1.0版本之间有很好的比较。 根据它: 用于Apache Hadoop的Spring 1.0版本将HDFS和MapReduce与MapReduce v1或MapR…

汇编语言 第三章小节

汇编语言第三章小结 概述: 此章节的总标题叫做 “寄存器(内存访问)”, 其教学目的是“从访问内存的角度继续学习几个寄存器“。那么,介绍了哪些寄存器呢。其一: 用来访问数据段的”DS寄存器“; 其二&#x…

激发你的灵感:16个精美视差效果网页设计作品

对于视差滚动(Parallax Scrolling),关注网页设计的朋友都不会陌生。在网页设计中,视差滚动是一种很特别的网页设计技术,通过让多层背景以不同的速度或者不同的方向移动形成 3D 运动效果,有很强的视觉冲击力…

Eclipse的Mockito模板

有时候,我想念树林里的树木-那是一段令人不安的长时间。 我最近才再次意识到这一点,在无数次中键入了一个更详细的模拟表达式。 有问题的语句是doAnswer(Answer)构造,使用涉及到的静态导入和泛型的东西进行编码总是很麻烦。 尽管我定期使用E…

【洛谷2801】教主的魔法(分块经典入门题)

点此看题面 大致题意: 给你一个序列,要你支持两种操作:第一种是区间加法,第二种是查询区间内大于等于\(x\)的数的个数。 考虑分块 这应该是一道比较经典的分块入门题吧。 首先,我们将序列分块。 对于修改操作&#xff…

cut和tr命令的联合使用

cut的-d选项只能是单个字符,而对于多个连续相同字符分隔的字段,单凭cut命令是达不到想要的效果的,特别是多个连续空格分隔时。 但借助tr -s的压缩重复字符功能,可以将多个连续空格压缩为一个空格,然后再交给cut处理就容…

使用 Web Tracing Framework 分析富 JS 应用的性能

来自谷歌的 Web Tracing Framework 包含一组工具和脚本,用于 JavaScript 相关代码的性能分析。它是重 JavaScript 应用程序的理想选择,而 JavaScript 仅用于简单的交互的网页可能没有必要。有一个手动嵌入选项和一个 Chrome 扩展,用于获取内部…

php yii2 获取表里最大的id_Yii2中自带分页类实现分页

1.首先写控制器层先引用pagination类use yiidataPagination;写自己的方法:function actionFenye(){$data Field::find(); //Field为model层,在控制器刚开始use了field这个model,这儿可以直接写Field,开头大小写都可以,为了规范,我写的是大写$pages new Pagination([totalCou…

android 操作系统升级,关于手机操作系统升级的问题

最近身边的好几个朋友问我操作系统方面问题,操作系统就是负责对计算机硬件进行直接控制以及管理的系统软件,它包含的功能也是多方面的,一般包括处理器管理,储存,文件,设备以及作业管理等等。把操作系统的内…

FindBugs Maven插件教程

FindBugs是一种静态代码分析工具,可识别从Java代码中发现的问题。 我们可以使用FindBugs Maven插件将FindBugs集成到我们的构建过程中。 这篇博客文章确定了四个典型的用例,并描述了我们如何配置FindBugs Maven插件以支持每个用例。 描述的用例是&…

Mac包管理神器Homebrew

概念 简称brew,是Mac OSX上的软件包管理工具,能在Mac中方便的安装软件或者卸载软件,相当于Red hat的yum、Ubuntu的apt-get。 安装命令 ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)” 常…

网站大流量高并发访问的处理解决办法

————————目录————————- 1、硬件升级2、服务器集群、负载均衡、分布式3、CDN4、页面静态化5、缓存技术(Memcache、Redis)以上为架构层面以下为网站本地项目层面6、数据库优化 1、数据库分表技术 2、数据库读写分离 3、表建立相应的索引7、禁止盗链8、控制大文…

【完成整理】45套很酷的长影影 LOGO 设计

长阴影其实就是扩展了对象的投影,感觉是一种光线照射下的影子,通常采用角度为 45 度的投影,给对象添加了一份立体感。长阴影(Long Shadow)概念来自于最新非常流行的扁平化设计(Flat Design)。扁…

简述select语句的完整语法_SQL里的各种语句的完整语法

SQL分类:DDL—数据定义语言(CREATE,ALTER,DROP,DECLARE)  DML—数据操纵语言(SELECT,DELETE,UPDATE,INSERT)DCL—数据控制语言(GRANT,REVOKE,COMMIT,ROLLBA…

android 坐标点计算器,Android实现简易计算器

开之前我还是想问问老师,为什么一定要星期天前交作业呢?由于条件限制,作品是赶出来的不是细细琢磨出来的。所以在这版apk中功能较为简易,有待后期再不断更新与优化总体效果图如下布局activity_main.xml部分代码功能代码MainActivi…

使用反射进行测试

根据我以前的帖子,我正在撰写有关“单一责任原则”的演讲。 我花了大部分时间。 同时,我想分享一个示例代码,说明如何在类中测试内部字段。 我这样做是为了进行特殊的测试,这更多的是集成测试。 在依赖类的标准单元测试中&#x…

1的恢复出厂设置在哪里_罗斯蒙特变送器怎么恢复出厂设置?

罗斯蒙特变送器怎么恢复出厂设置?特殊情况下,罗斯蒙特变送器需要恢复出厂设置。罗斯蒙特变送器进行出厂设置的方法非常简单,只需要用手操器或AMS设备管理器就能操作。罗斯蒙特手操器里有一个恢复出厂调整值–传感器量程调整命令,使用此命令就…

【技术累积】【点】【java】【25】Orderd

基础概念 Orderd是spring core中定义的一个接口,使用它以及相关的Comparator和Order注解,可以实现对元素的排序。 Order 直接先说下Order注解吧,使用场景较多。 Retention(RetentionPolicy.RUNTIME) Target({ElementType.TYPE, ElementType.M…

android 展示星期方式,Android显示从一周到另一周的日期(星期四至星期四)

最后我得到了工作一个解决方案,解决我的问题:在OnCreate中:TextView tv_chart_menuvotes (TextView) findViewById(R.id.tv_chart_menuvotes);String csPrevThur getPreviousThursday();String csNextThur getNextThursday();tv_chart_men…

Java 8 – Date API的新增功能

随着Java 8最终版本的发布,令我兴奋的新功能之一就是新的Date API,这是JSR 310的工作成果。 尽管Lambda表达式无疑是Java 8的一大亮点,但是拥有更好的日期处理方式无疑是受欢迎的。 这是一篇简短的文章(第2部分或第3部分的第1部分…