【Android】Thread与Runnable

开发者福利!热门AI工具限时免费用 购周边即赠Coding Plan Lite,Claude Code、Cursor等20+工具畅享,效率翻倍! 阅读详情

一、基本概念

        Android中的多线程主要是为了操作一些耗时的工作,防止其将主程序进行阻塞,与Java一样两种方式:1、继承Thread 2、实现Runnable接。但是Android与Java的多线程有一点区别是Android中的更新UI必须在主线程中进行,否则抛出异常,因为Android的UI是线程不安全的。

1、Thread类

       Android中的Thread类是扩展了java.lang.Thread类的多线程类,其中有一个构造函数其实也实现了Runnable的接口,源码如下:

/**
     * Constructs a new {@code Thread} with a {@code Runnable} object, the given
     * name and belonging to the {@code ThreadGroup} passed as parameter.
     *
     * @param group
     *            {@code ThreadGroup} to which the new {@code Thread} will
     *            belong
     * @param runnable
     *            a {@code Runnable} whose method <code>run</code> will be
     *            executed by the new {@code Thread}
     * @param threadName
     *            the name for the {@code Thread} being created
     * @param stackSize
     *            a stack size for the new {@code Thread}. This has a highly
     *            platform-dependent interpretation. It may even be ignored
     *            completely.
     * @throws IllegalThreadStateException
     *             if <code>group.destroy()</code> has already been done
     * @see java.lang.ThreadGroup
     * @see java.lang.Runnable
     */
    public Thread(ThreadGroup group, Runnable runnable, String threadName, long stackSize) {
        if (threadName == null) {
            throw new NullPointerException("threadName == null");
        }
        create(group, runnable, threadName, stackSize);
    }

    Thread类代表线程类,它的两个最主要的方法是:

    run()——包含线程运行时所执行的代码

    Start()——用于启动线程

2、Runnable接口

public interface Runnable {      
/**
     * Starts executing the active part of the class' code. This method is
     * called when a thread is started that has been created with a class which
     * implements {@code Runnable}.
     */      
    void run();
}

       Runable源码如上所示,可以看到中只有run方法。下面的例子中的Runable在主线程执行修改UI的代码,并且“OK”的执行是在输出10个“runable”后,所以分析得到Runable只是一个接口并没有开启线程,依旧是运行在UI线程中。

protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        runnable.run();
        Log.d("RunnableTest", "OK");


    }
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                for(int i = 0;i<10;i++) {
                    textView.setText("runable");
                    Log.d("RunnableTest", "runable");
                }
            }
};

二、Thread与Runnable实现多线程方法对比

            以网上多线程学习最经典的买票系统为例:

1、Thread实现

public class TicketThread extends Thread{

    private int ticket = 10;

    public void run(){
        for(int i =0;i<10;i++){
            synchronized (this){
                if(this.ticket>0){
                    try {
                        Thread.sleep(100);
                        System.out.println(Thread.currentThread().getName()+"卖票---->"+(this.ticket--));
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }

    public static void main(String[] arg){
        TicketThread t1 = new TicketThread();
        new Thread(t1,"线程1").start();
        new Thread(t1,"线程2").start();
    }
}

 输出:
线程1卖票—->10
线程1卖票—->9
线程1卖票—->8
线程2卖票—->7
线程2卖票—->6
线程1卖票—->5
线程1卖票—->4
线程2卖票—->3
线程2卖票—->2
线程1卖票—->1

2、Runnable实现

public class TicketRunnable implements Runnable{

    private int ticket = 10;

    @Override
    public void run() {
        for(int i =0;i<10;i++){
            //添加同步快
            synchronized (this){
                if(this.ticket>0){
                    try {
                        //通过睡眠线程来模拟出最后一张票的抢票场景
                        Thread.sleep(100);
                        System.out.println(Thread.currentThread().getName()+"卖票---->"+(this.ticket--));
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }

    public static void main(String[] arg){
        TicketRunnable t1 = new TicketRunnable();
        new Thread(t1, "线程1").start();
        new Thread(t1, "线程2").start();
    }
}

 输出:
线程1卖票—->10
线程1卖票—->9
线程1卖票—->8
线程1卖票—->7
线程2卖票—->6
线程2卖票—->5
线程2卖票—->4
线程2卖票—->3
线程2卖票—->2
线程2卖票—->1

三、总结

从上面的例子可以看出两种方式均可实现多线程也都可以实现资源共享区别最主要的就是一个是继承,一个是实现

实现Runnable接口比继承Thread类所具有的优势总结如下:

1):适合多个相同的程序代码的线程去处理同一个资源,把虚拟CPU(线程)同程序的代码,数据有效的分离,较好地体现了面向对象的设计思想。

2):可以避免java中的单继承的限制,比如当我们要将已经继承了某一个类的子类放入多线程中,由于一个类不能同时有两个父类,所以不能用继承Thread类的方式,那么,这个类就只能采用实现Runnable接口的方式了

3):增加程序的健壮性,代码可以被多个线程共享,代码和数据独立。当多个线程的执行代码来自同一个类的实例时,即称它们共享相同的代码。多个线程操作相同的数据,与它们的代码无关。当共享访问相同的对象是,即它们共享相同的数据。当线程被构造时,需要的代码和数据通过一个对象作为构造函数实参传递进去,这个对象就是一个实现了Runnable接口的类的实例。 

 

 

Android -- 多线程】继承 Thread Android 多线程之 Thread 阅读详情

相关推荐

android 多线程Thread,Runnable,Handler,AsyncTask等之间的关系

Java的多线程是Thread实现,跟runnable没有太大关系。 android中因为需要多线程交换数据出现了handler+message+thread实现多线程数据通信。就hanlder本身而言并不是实现多线程。 因为handler+message+thread手写比较负载,所以android提供AsyncTask去实现多线程,并且拥有多线程数据同步的能力。 AsyncTask的本质就是handler+message+thread(线程池)的实现。因此要是简单的使用多线程,android中使用a

u012565107的专栏 4918

Android中使用Runnable接口的简单示例

在上述代码中,我们首先在MainActivity的onCreate()方法中初始化了一个包含3个线程的线程池mExecutor,然后创建了一个MyRunnable实例myRunnable,并通过mExecutor.execute(myRunnable)方法将任务提交给线程池执行。在Android开发中,使用Runnable接口可以很方便地在后台线程中执行耗时操作,从而避免主线程阻塞和界面卡顿的问题。在该类中,我们需要重写Runnable接口中的run()方法,该方法将在后台线程中执行。

CyberJolt的博客 342

大话Android多线程(一) ThreadRunnable的联系和区别

2、都需要重写里面()方法。

2401_84123232的博客 1186

使用RunnableAndroid上实现任务中断恢复

在本文中,我们介绍了如何使用Runnable接口在Android上实现任务的中断恢复。通过使用一个标志变量和循环来检查中断状态,我们可以在任务执行过程中实现中断的功能。在Android开发中,我们经常需要在后台线程中执行一些耗时的任务。然而,有时候我们希望能够中断这些任务的执行,并在需要时恢复执行。方法中,我们使用一个循环来执行任务,并在每次循环迭代时检查线程的中断状态。当需要恢复任务时,我们只需再次创建一个新的线程并启动它。首先,我们需要创建一个实现了Runnable接口的类,用于执行我们的任务。

2301_79325657的博客 273

Android——RunnableThread,进阶:Callable接口 / Runnable接口 / Future接口

1. 简介 为什么要有,Callable接口和Runnable接口? 我们知道创建线程的方式有两种,一种是实现Runnable接口,另一种是继承Thread,但是这两种创建线程的方式都有个问题,执行完任务后无法获取返回结果,于是,就有了Callable接口和Runnable接口。 看看创建线程的两个方法: Class MyThread extends Thread{ @Override Void run(){ } } new MyThread().start(); Cla

Yawn 2818

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

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

Carson带你学Android 1万+

Android开发之RunnableThread的区别

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

月女冬舞的博客 980

[Android] Handler ,Thread,Runnable的关系

Handler的定义   主要接受子线程发送的数据, 并用此数据配合主线程更新UI.  解释: 当应用程序启动时,Android首先会开启一个主线程 (也就是UI线程) , 主线程为管理界面中的UI控件,进行事件分发。   比如说, 你要是点击一个 Button, Android会分发事件到Button上,来响应你的操作。如果此时需要一个耗时的操作,例如: 联网读取数据,或者读取本地较大的一个文件的时候,你不能把这些操作放在主线程中,如果你放在主线程中的话,界面会出现假死现象, 如果5秒钟还没有完成的话

weixin_38423311的博客 383

android thread Runnable

原文链接:http://blog.csdn.net/boyupeng/article/details/6208072 这篇文章中有三点需要提前说明一下, 一: 在android中有两种实现线程thread的方法: 一种是,扩展java.lang.Thread类另一种是,实现Runnable接口 二:Thread类代表线程类,它的两个最主要的方法是:run()—...

asm2826的博客 204

androidThreadRunnable、Asyntask的区别联系

Android中的UI主线程不是线程安全的。开发人员必须注意以下两点: 1.更新UI界面的操作必须在UI主线程中进行 2.耗时操作不能在UI主线程中进行,否则会出现ANR错误 那么如果我要完成一个耗时操作,结束后更新UI界面来显示耗时操作的结果,应该怎么办呢? 有两种方法:使用Thread+Handler;使用AsynTask。具体方法网上很多文章,这里不再赘述。 无论Thread、Run

huxueyan521的专栏 8594

Android中Handler RunnableThread的区别详解

总结整理为:在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口;继承Thread类的程序按规律顺序执行,没有相互作用,实际开发中一个多线程的操作很少使用Thread类,而是通过Runnable接口完成,Handler可以异步控制Runnable,但是在使用Runnable定义的子类中没有start()方法,只有Thread类中才有,可以通过Thread类来

成长笔记 737

Android中Handler 、ThreadRunnable之间的关系

在多线程编程的时候,我们经常会用到Handler,ThreadRunnable这三个类,我们来看看这三个类之间是怎么样的关系?   首先说明Android的CPU分配的最小单元是线程,Handler一般是在某个线程里创建的,因而Handler和Thread就是相互绑定的,一一对应。 而Runnable是一个接口,ThreadRunnable的子类。可以说,他俩都算一个进程。Han...

tectrol的专栏 798

Android异步学习(一):ThreadRunnable

对于Android中异步的实现方式主要有以下三种: Java ThreadRunnable Android Handler、AsyncTask RxAndroid 以后会分别对三种方式进行说明,

阿秋的Blog 737

Android中Handler ThreadRunnable之间的关系

Android中Handler ThreadRunnable之间的关系 在多线程编程这块,我们经常要使用Handler,Thread和Runnbale这三个类,那么他们之间的关系你是否弄清楚了呢? 首先,说明Android的CPU分配的最小单元是线程,Handler一般是在某个线程里创建的,因而Handler和Thread就是相互绑定的,一一对应。 而Runnable是一个接口,Threa

yy_451686712的专栏 934

Android中Handler RunnableThread的区别

本篇文章是对在Android中Handler RunnableThread的区别进行了详细的分析介绍,需要的朋友参考下 在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口;Thread类是在java.lang包中定义的。一个类只要继承了Thread类同时覆写了本类中的run()方法就可以实现多线程操作了,但是一个类只能继承一个父类,这是此方法的局限

日居月诸的专栏 619

Android Thread/Runnable/Handler用法

public class MainActivity extends Activity implements OnClickListener { //1.Runnable,实现Runnable类的方式 public class myRunnable implements Runnable{ @Override public void run(){ //写子线程中的操作 init(...

Android系统攻城狮 661
上一篇: 【Android】Java 匿名类初探~~
下一篇: 【Android】保持屏幕常亮唤醒状态
louislrt
博客等级 码龄17年 2粉丝 28原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值