Android多線程:繼承Thread類 使用解析(含實(shí)例教程)


前言

  • Android開發(fā)中,多線程的使用十分常見
  • 今天铡羡,我將全面解析多線程其中一種常見用法:繼承Thread類积蔚。

Carson帶你學(xué)多線程系列
基礎(chǔ)匯總
Android多線程:基礎(chǔ)知識匯總
基礎(chǔ)使用
Android多線程:繼承Thread類使用(含實(shí)例教程)
Android多線程:實(shí)現(xiàn)Runnable接口使用(含實(shí)例教程)
復(fù)合使用
Android 多線程:AsyncTask使用教程(含實(shí)例講解)
Android 多線程:AsyncTask原理及源碼分析
Android多線程:HandlerThread使用教程(含實(shí)例講解)
Android多線程:HandlerThread原理及源碼分析
Android多線程:IntentService使用教程(含實(shí)例講解)
Android多線程:IntentService的原理及源碼分析
Android多線程:線程池ThreadPool全方位教學(xué)
相關(guān)使用
Android異步通信:這是一份全面&詳細(xì)的Handler機(jī)制學(xué)習(xí)攻略
Android多線程:手把手教你全面學(xué)習(xí)神秘的Synchronized關(guān)鍵字
Android多線程:帶你了解神秘的線程變量 ThreadLocal


目錄

示意圖

1. 簡介

此處需要注意的是線程對象 & 運(yùn)行線程的區(qū)別

  • 線程對象是運(yùn)行線程的實(shí)體,線程對象是控制線程行為的唯一手段烦周;
  • 線程對象是通過線程類實(shí)例化創(chuàng)建的尽爆,負(fù)責(zé)控制線程的狀態(tài)如運(yùn)行怎顾、睡眠、掛起/停止漱贱。

2. 使用步驟

2.1 常規(guī)使用

// 步驟1:創(chuàng)建線程類 (繼承自Thread類)
   class MyThread extends Thread{

// 步驟2:復(fù)寫run()槐雾,內(nèi)容 = 定義線程行為
    @Override
    public void run(){
    ... // 定義的線程行為
    }
}

// 步驟3:創(chuàng)建線程對象,即 實(shí)例化線程類
  MyThread mt=new MyThread(“線程名稱”);

// 步驟4:通過 線程對象 控制線程的狀態(tài)幅狮,如 運(yùn)行募强、睡眠、掛起  / 停止
// 此處采用 start()開啟線程
  mt.start();

2.2 簡便使用:匿名類

很多情況下崇摄,開發(fā)者會選擇一種更加方便的方法去創(chuàng)建線程:匿名類

// 步驟1:采用匿名類钻注,直接 創(chuàng)建 線程類的實(shí)例
 new Thread("線程名稱") {
                 // 步驟2:復(fù)寫run(),內(nèi)容 = 定義線程行為
                    @Override
                    public void run() {       
                  // 步驟3:通過 線程對象 控制線程的狀態(tài)配猫,如 運(yùn)行幅恋、睡眠、掛起  / 停止   
                      }.start();

2.3 區(qū)別

2種方法本質(zhì)相同泵肄,但是各有優(yōu)劣勢 & 不同的應(yīng)用場景:

大家可根據(jù)自己的需求場景來選擇具體的使用方法

示意圖

為了讓大家理解更加深刻捆交,下面例子我都會采用方法1 = 常規(guī)方式 來演示


3. 實(shí)例應(yīng)用

實(shí)例1

  • 應(yīng)用場景:創(chuàng)建兩個線程-實(shí)現(xiàn)兩個相同的耗時任務(wù)
  • 實(shí)例說明:實(shí)現(xiàn)2個窗口同時賣火車票;每個窗口賣100張腐巢,賣票速度都是1s/張

建議先下載Demo再看分析:Carson_Ho的Github地址:多線程之繼承Thread類

  • 具體實(shí)現(xiàn)

main_activity.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    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">

//設(shè)置一個按鈕用以啟動賣票
    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="點(diǎn)擊開始賣票"
        android:layout_centerInParent="true"
        />
</RelativeLayout>

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:創(chuàng)建線程類,繼承自Thread類
    private class MyThread extends Thread{

        private int ticket = 100;//一個窗口有100張票
        private String name; //窗口名, 也即是線程的名字

        public MyThread(String name){
            this.name=name;
        }

        //在run方法里復(fù)寫需要進(jìn)行的操作
        @Override
        public void run(){
            while (ticket>0){
                ticket--;
                System.out.println(name + "賣掉了1張票品追,剩余票數(shù)為:"+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按下時會開啟一個新線程執(zhí)行賣票
            button = (Button) findViewById(R.id.button);
            button.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {

                    //步驟2:創(chuàng)建線程類的實(shí)例
                    //創(chuàng)建二個線程,模擬二個窗口賣票
                    MyThread mt1 = new MyThread("窗口1");
                    MyThread mt2 = new MyThread("窗口2");

                    //步驟3:調(diào)用start()方法開啟線程
                    //啟動二個線程冯丙,也即是窗口肉瓦,開始賣票
                    mt1.start();
                    mt2.start();

                }
            });

        }
    }


  • 測試結(jié)果
結(jié)果展示

實(shí)例2

  • 應(yīng)用場景:創(chuàng)建兩個線程-實(shí)現(xiàn)兩個不同的耗時任務(wù)
  • 實(shí)例說明:實(shí)現(xiàn)2個窗口同時賣火車票;每個窗口賣100張胃惜,但賣票速度不同:窗口1是1s/張泞莉,窗口2是3s/張

建議先下載Demo再看分析:Carson_Ho的Github地址:多線程之繼承Thread類

  • 具體實(shí)現(xiàn)

main_activity.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    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">

    //設(shè)置一個按鈕以啟動賣票
    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="點(diǎn)擊開始賣票" />
</RelativeLayout>

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:創(chuàng)建線程類,繼承自Thread類
    //因?yàn)檫@里需要有兩個操作:一個窗口賣票速度是1s/張,一個窗口是3s/張
    //所以需要創(chuàng)建兩個Thread的子類

    //第一個Thread子類實(shí)現(xiàn)一個窗口賣票速度是1s/張
    private class MyThread1 extends Thread{

        private int ticket = 100;//一個窗口有100張票
        private String name; //窗口名, 也即是線程的名字

        public MyThread1(String name){
            this.name=name;
        }

        //在run方法里復(fù)寫需要進(jìn)行的操作:賣票速度是1s/張
        @Override
        public void run(){
            while (ticket>0){
                ticket--;
                System.out.println(name + "賣掉了1張票,剩余票數(shù)為:"+ticket);

                try {
                    Thread.sleep(1000);//賣票速度是1s一張
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }

    }

    //第二個Thread子類實(shí)現(xiàn)一個窗口賣票速度是3s/張
    private class MyThread2 extends Thread{

        private int ticket = 100;//一個窗口有100張票
        private String name; //窗口名, 也即是線程的名字

        public MyThread2(String name){
            this.name=name;
        }

        //在run方法里復(fù)寫需要進(jìn)行的操作:賣票速度是3s/張
        @Override
        public void run(){
            while (ticket>0){
                ticket--;
                System.out.println(name + "賣掉了1張票船殉,剩余票數(shù)為:"+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按下時會開啟一個新線程執(zhí)行賣票
        button = (Button) findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                //步驟2:創(chuàng)建線程類的實(shí)例
                //創(chuàng)建二個線程鲫趁,模擬二個窗口賣票
                MyThread1 mt1 = new MyThread1("窗口1");
                MyThread2 mt2 = new MyThread2("窗口2");

                //步驟3:調(diào)用start()方法開啟線程
                //啟動二個線程,也即是窗口利虫,開始賣票
                mt1.start();
                mt2.start();

            }
        });

    }
}



4. 與“實(shí)現(xiàn)Runnable接口”對比

  • Java中疫剃,繼承 Thread類和實(shí)現(xiàn)Runnable接口是實(shí)現(xiàn)多線程最常用的2種方法
  • 今天我們就來對比下這兩種方法

若你還不熟悉實(shí)現(xiàn)Runnable接口,建議你先去看
Android多線程:實(shí)現(xiàn)Runnable接口 使用解析(含實(shí)例教程)

示意圖

5. 總結(jié)

  • 本文主要對多線程中繼承Thread類的用法進(jìn)行了全面介紹
  • 下一篇文章我將對講解Android多線程的相關(guān)知識硼讽,感興趣的同學(xué)可以繼續(xù)關(guān)注Carson_Ho的簡書

Carson帶你學(xué)多線程系列
基礎(chǔ)匯總
Android多線程:基礎(chǔ)知識匯總
基礎(chǔ)使用
Android多線程:繼承Thread類使用(含實(shí)例教程)
Android多線程:實(shí)現(xiàn)Runnable接口使用(含實(shí)例教程)
復(fù)合使用
Android 多線程:AsyncTask使用教程(含實(shí)例講解)
Android 多線程:AsyncTask原理及源碼分析
Android多線程:HandlerThread使用教程(含實(shí)例講解)
Android多線程:HandlerThread原理及源碼分析
Android多線程:IntentService使用教程(含實(shí)例講解)
Android多線程:IntentService的原理及源碼分析
Android多線程:線程池ThreadPool全方位教學(xué)
相關(guān)使用
Android異步通信:這是一份全面&詳細(xì)的Handler機(jī)制學(xué)習(xí)攻略
Android多線程:手把手教你全面學(xué)習(xí)神秘的Synchronized關(guān)鍵字
Android多線程:帶你了解神秘的線程變量 ThreadLocal


歡迎關(guān)注Carson_Ho的簡書

不定期分享關(guān)于安卓開發(fā)的干貨巢价,追求短、平、快蹄溉,但卻不缺深度咨油。


請點(diǎn)贊!因?yàn)槟愕墓膭钍俏覍懽鞯淖畲髣恿Γ?/h1>

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末柒爵,一起剝皮案震驚了整個濱河市役电,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌棉胀,老刑警劉巖法瑟,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異唁奢,居然都是意外死亡霎挟,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進(jìn)店門麻掸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來酥夭,“玉大人,你說我怎么就攤上這事脊奋“颈保” “怎么了?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵诚隙,是天一觀的道長讶隐。 經(jīng)常有香客問我,道長久又,這世上最難降的妖魔是什么巫延? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮地消,結(jié)果婚禮上炉峰,老公的妹妹穿的比我還像新娘。我一直安慰自己犯建,他們只是感情好讲冠,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著适瓦,像睡著了一般。 火紅的嫁衣襯著肌膚如雪谱仪。 梳的紋絲不亂的頭發(fā)上玻熙,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天,我揣著相機(jī)與錄音疯攒,去河邊找鬼嗦随。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的枚尼。 我是一名探鬼主播贴浙,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼署恍!你這毒婦竟也來了崎溃?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤盯质,失蹤者是張志新(化名)和其女友劉穎袁串,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體呼巷,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡囱修,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了王悍。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片破镰。...
    茶點(diǎn)故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖压储,靈堂內(nèi)的尸體忽然破棺而出鲜漩,到底是詐尸還是另有隱情,我是刑警寧澤渠脉,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布宇整,位于F島的核電站,受9級特大地震影響芋膘,放射性物質(zhì)發(fā)生泄漏鳞青。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一为朋、第九天 我趴在偏房一處隱蔽的房頂上張望臂拓。 院中可真熱鬧,春花似錦习寸、人聲如沸胶惰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽孵滞。三九已至,卻和暖如春鸯匹,著一層夾襖步出監(jiān)牢的瞬間坊饶,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工殴蓬, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留匿级,地道東北人。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像痘绎,于是被迫代替她去往敵國和親津函。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,060評論 2 355