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,一经查实,立即删除!

相关文章

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

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

Eclipse的Mockito模板

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

使用 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 操作系统升级,关于手机操作系统升级的问题

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

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

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

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

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

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

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

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

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

Guzzle – 构建 RESTful Web 服务的 PHP HTTP 框架

Guzzle 减轻了发送 HTTP 请求和创建 Web 服务客户端的痛苦。它包含建立一个强大的网络服务客户端的工具,包括:服务描述定义的输入和输出的 API,资源迭代器遍历分页资源,尽可能有效地发送大量的请求。 您可能感兴趣的相关文章特别推…

小米手机升级Android6,小米3能升级miui 6?小米3升级miui v6教程

小米3升级miui v6教程来咯~小编还带来了miui v6下载,MIUI V6系统有了很多的变化,小米3是可以升级miui6系统的哦~如果你不知道步骤的话,就请参考下文吧。第一步、下载工具包和线刷完整包,下载完成后解压(请检查线刷包文件后缀名是否…

第一次java作业

转载于:https://www.cnblogs.com/TuTu-winer/p/10591021.html

推荐25款很棒的 HTML5 前端框架和开发工具【下篇】

快速,安全,响应式,互动和美丽,这些优点吸引更多的 Web 开发人员使用 HTML5。HTML5 有许多新的特性功能,允许开发人员和设计师创建应用程序和网站,带给用户桌面应用程序的速度,性能和体验。 这里…

android18lazuli,The Rise And Fall Of Android 17

Hey guys, Tommy here. Today I’m bringing you another blog talking about Android 17. I’ve had mixed emotions on Android 17’s return in Dragon Ball Super since it originally happened. I feel like now with this whole Android 17‘a return is something I sho…

luogu P1462 通往奥格瑞玛的道路

嘟嘟嘟 这道题的题面相当的迷,我看了半天都没懂。最后看了题解的解释才懂。 他是这么个意思:对于所有能活着走到终点的路径,输出每一条路径中过路费最多的城市的最小值。 那么自然想到二分过路费,然后用dijkstra或spfa判断是否存在…

Maven私服(Nexus)搭建总结

因为工作需要,第一次搭建Maven私服,使用的是目前最流行的Sonatype Nexus。搭建私服并不难,官网有很详细的说明,只需几个步骤即可搭建一个可用的私服,但因为公司系统环境(测试)的原因还是遇到几个…

Effeckt.css – CSS3 Transitions Animations 精妙应用

CSS3 不仅仅用作界面效果补充,还可以用来替换传统的一些界面实现,而且效果更酷。Effeckt.css 收集了众多精妙的 CSS3 Transitions & Animations 效果应用,例如:弹窗、按钮、导航、列表、页面切换等等。 您可能感兴趣的相关文章…

html如何让字体自动变色,CSS使文字部分变色

思路思路很简单,就是一个字写两遍,一个字只显示部分,不过不能真的把一个字写两遍。这里就需要用到CSS伪元素:before和:after,记住这个“伪元素”的“伪”字,表明它本来是不存在的。我们的方法就是在伪元素里放置相同的…

Codrops 教程:基于 CSS3 的精美模态窗口效果

Codrops 分享了漂亮的模态窗口效果实现方法,希望给前端开发人员提供一些创新显示对话框的启示。这个方案使用了触发按钮(或任何的 HTML 元素),在点击的时候出现一个模态窗口,带有简单的过渡(或动画&#xf…

html5录像功能限制时间,HTML5拍照和摄像机功能实战详解

开篇最近在做一个chrome app的云相机应用,应用包括拍照、摄像、保存照片视频、上传文件等等核心功能,其中涉及到很多HTML5对媒体流相关的API。写这篇文章的目的,其一是总结梳理知识点,最重要是希望对有相关需求的读者提供一些指导…