继承Thread类实现多线程简单实例

文章目录

  • 继承Thread类实现多线程简单实例
  • 一、多线程的意义
  • 二、多线程的创建
  • 三、代码

一、多线程的意义

1.为什么要使用多线程

(a)提高用户体验或者避免ANR
在事件待处理码中需要使用多线程,否则会出现ANR(Application is not responding),或者因为响应时间太慢导致用户体验很差。

(b)异步
应用中有些情况并不一定需要同步阻塞去等待返回结果,可以通过多线程实现异步,例如你的应用中的某个Activity需要从云端获取一些图片,加载图片比较耗时,这时就需要异步加载,加载完成一个图片刷新一个。

(c)多任务
多线程下载

2.为什么通过多线程可以提高用户体验,避免ANR

(a)深入了解

Android应用程序的main线程,它负责处理UI的绘制,Android系统为了防止应用程序反应较慢导致无法正常运行做了一个处理,一种情况是当用户输入事件5秒内无法得到相应,那么系统会弹出ANR对话框,由用户决定继续等待还是强制结束应用程序,另一种情况就是BroadcastReciever超过10s没执行完也会弹出。

即使你的程序中的某个事件响应不超过5分钟,人眼可辨别的时间是0.1秒,小于0.1秒基础感觉不出来,超过0.2秒用户就觉得有点卡了,俗称“打嗝”现象,用户体验会很差。

比如有些应用,它要显示很多图片,所以它是异步的,可以在图片加载成功之前显示一个默认的图片,加载成功后刷新一下即可。

(b)事件处理的原则
①所有耗时的操作都放到其他线程去处理。

②Android中的Main线程的事件处理不能太耗时,否则后续事件无法在5秒内得到回应,就会弹出ANR对话框。

(c)Main线程
①Activity的生命周期的方法

②通常on开头的方法是在Main线程中回调的

③onStart()、onCreate()、onResume()执行时间决定了首页的打开时间。

④可以使用SplashScreen,用动态的,让用户知道你的应用没死掉。

3.如何实现多线程之间的通讯
(a)Handler

(b)AsyncTask

二、多线程的创建

1.继承Thread类实现多线程

Thread本质上也是实现了Runnable接口的一个实例,他代表一个线程的实例,并且启动线程的唯一方法就是通过Thread类的start()实例方法。

start()方法是一个native方法,他将启动一个新线程,并执行run()方法,通过自己的类直接extend Thread,并复写run()方法,就可以启动新线程并执行自己的run()方法。

2.实现Runable接口方式实现多线程

如果自己的类已经extends另一个类,就无法直接extends Thread,此时必须实现一个Runnable接口。

同时为了启动MyThread,需要首先实例化一个Thread,并传入自己的已经实现好Runnable接口的目标对象。

3.实现Runable和实现Thread的区别

(a)一个类只能继承一个父类,存在局限;一个类可以实现多个接口

(b)在实现Runnable接口的时候调用Thread(Runnable target)创建进程时,使用同一个Runnable实例,则建立的多线程的实例变量也是共享的。但是通过继承Thread类是不能用一个实例建立多个线程,故而实现Runnable接口适用于资源共享。当然,继承Thread类也能够共享变量,能共享Thread类的static变量

(c)Runnable接口和Thread之间的联系
public class Thread extends Object implements Runnable
可以看出Thread类也是Runnable接口的子类

三、代码

MainActivity代码:

package bnuz.it.wjy.hellothread;import androidx.appcompat.app.AppCompatActivity;import android.mtp.MtpConstants;
import android.os.Bundle;
import android.view.View;public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}public void btnOnclick(View view){//        testThread();
//        testRunnable();testSale();}public void testThread(){MyThread mt1 = new MyThread();MyThread mt2 = new MyThread();mt1.start();mt2.start();}public void testRunnable(){MyRunnable mr1 = new MyRunnable();MyRunnable mr2 = new MyRunnable();Thread t1 = new Thread(mr1);
//        Thread t2 = new Thread(mr2);
//        多个Thread对象可以共用一个mr
//        线程同步Thread t2 = new Thread(mr1);t1.start();t2.start();}public void testSale(){SaleTicket saleTicket = new SaleTicket();Thread t1 = new Thread(saleTicket,"A代理");Thread t2 = new Thread(saleTicket,"B代理");Thread t3 = new Thread(saleTicket,"C代理");Thread t4 = new Thread(saleTicket,"D代理");t1.start();t2.start();t3.start();t4.start();}
}

布局代码:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Thread"android:id="@+id/Thread"android:onClick="btnOnclick"/>
</RelativeLayout>

MyThread类

package bnuz.it.wjy.hellothread;import android.util.Log;public class MyThread extends Thread{@Overridepublic void run() {Log.d("TAG",Thread.currentThread().getName()+".run()");}
}

MyRunnable类

package bnuz.it.wjy.hellothread;import android.util.Log;public class MyRunnable implements Runnable{@Override
//    必须是实现run()方法public void run() {Log.d("TAG",Thread.currentThread().getName()+".run()");}
}

SaleTicket类

package bnuz.it.wjy.hellothread;import android.util.Log;public class SaleTicket implements Runnable{private int ticket = 20;@Overridepublic void run() {while (true){if(ticket > 0){Log.d("TAG",Thread.currentThread().getName()+"卖出了第"+(20-ticket+1)+"张票");ticket--;}else{break;}}try {Thread.sleep(200);}catch (InterruptedException e){e.printStackTrace();}}
}

继承Thread类实现多线程简单实例相关推荐

  1. Java继承Thread类创建多线程

    Java继承Thread类创建多线程 单线程示例 示例,Example01.java public class Example01{public static void main(String[] a ...

  2. html解析图片url,并用继承Thread类的多线程下载

    html解析图片url,并用继承Thread类的多线程下载 pom依赖 Java代码 把对应网页的img元素,通过继承Thread类的多线程下载下来. pom依赖 <dependencies&g ...

  3. 继承Thread类使用多线程

    java实现多线程有两种方式,一种是继承Thread类,另外一种就是实现Runnable接口. 两种实现方法的优缺点: 使用Thread类实现多线程局限性就是不支持多继承,因为java是不支持类多继承 ...

  4. 多线程之继承Thread类及多线程内存分析

    *创建多线程的一种方式:继承Thread类 * java.lang.Thread是描述多线程的类,要实现多线程程序,一种方式就是继承Thread类 * 1.创建一个类Mythread让其extends ...

  5. 【Java多线程】实现Runnable接口方式 / 继承Thread类方式;使用synchronized锁实现线程安全;线程安全的懒汉式单例模式;死锁问题示例

    Thread 的生命周期 一.实现Runnable接口方式 1.在 run 方法中使用 synchronized 块 /*** 例子:创建三个窗口卖票,总票数为100张.使用实现Runnable接口的 ...

  6. Thread类实现多线程

    线程主体类:必须是实现特定的接口或者继承特定的父类才可以完成. 继承Thread类实现多线程 java.lang.Thread 一个类继承了此类表示这个类就是线程的主体类,并且需要覆写线程的主体方法r ...

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

    前言 在Android开发中,多线程的使用十分常见 今天,我将全面解析多线程其中一种常见用法:继承Thread类. 目录 示意图 1. 简介 示意图 2. 使用讲解 2.1 使用步骤 示意图 2.2 ...

  8. JavaSE基础二十:Java 多线程(线程基础知识、Java 多线程、Java 实现多线程(继承 Thread 类、实现 Runnable 接口、实现 Callable 接口))

    本章目录 1.基础知识准备 2.Java 多线程概述 3.Java 实现多线程 3.1.继承 Thread 类 如何开启新线程 Thread 类常用方法 多线程中的同步 Thread 类同步方法 多线 ...

  9. java线程如何继承,java多线程(一)之继承Thread类

    一.概述 进程:正在执行的应用程序 线程:进程的执行单元,执行路径 单线程:一个应用程序只有一条执行路径 多线程:一个应用程序有多条执行路径 二.两种实现方式, 下面为第一种方式: 继承Thread类 ...

最新文章

  1. 2021年春季学期-信号与系统-第四次作业参考答案-第十二小题
  2. ffmpeg图片压缩为视频
  3. 【IM】关于聚类评价算法的理解
  4. 杭州水利水电学院计算机多少学,杭州的一所很容易考上的公办本科大学——浙江水利水电学院...
  5. gearhost php,Gearhost 免费主机的申请
  6. IDEA 学习笔记之 安装和基本配置
  7. cnn对网络数据预处理_CNN中的数据预处理和网络构建
  8. LeetCode - Easy - 637. Average of Levels in Binary Tree
  9. C程序设计语言现代方法04:表达式
  10. Windows Server 2016-Windows控制台的新增功能
  11. [CTO札记]雅虎主页改版使用户停留时间增加20% -
  12. jQuery右键菜单ContextMenu使用笔记
  13. 将PDF论文的公式截图后转成Word可编辑公式
  14. 中国脑计划颠覆性创新之路四,用脑科学预测互联网的未来发展趋势
  15. 是什么导致了脸上的痤疮呢?
  16. ADC采样频率的计算
  17. java内存图解_java内存模型及GC原理 和 图解JVM在内存中申请对象及垃圾回收流程...
  18. eclipse neno高级安装
  19. 【Vuejs】1017- Vue3 效率提升主要表现在哪些方面?
  20. Air202掉坑日记(2)——连接阿里云成功后自动掉线(AT版本)

热门文章

  1. log4j中 logger 标签中additivity属性的用法
  2. 软考A计划-电子商务设计师-专业英语
  3. 青龙面板修改默认端口5700为其他
  4. c语言输出字符串显示在屏幕上,C语言输出printf
  5. C. Remove the Bracket
  6. 拓嘉启远电商:拼多多买家秀优化,有效提高转化
  7. linux触摸板设置密码程序6,Ubuntu16.04系统怎么自定义触控板手势?
  8. 小眼游戏架构:UI篇:三层架构(UI层)
  9. Numpy中的shape、reshape函数
  10. 传神助力进博会语言服务全覆盖 ,专业译员、翻译神器齐上阵