美文网首页
Android 多线程 02 --- 继承Thread类 使用解

Android 多线程 02 --- 继承Thread类 使用解

作者: 沪漂意哥哥 | 来源:发表于2022-05-20 16:35 被阅读0次

    一、简介 image.png

    此处需要注意的是线程对象 & 运行线程的区别

    • 线程对象是运行线程的实体,线程对象是控制线程行为的唯一手段;
    • 线程对象是通过线程类实例化创建的,负责控制线程的状态如运行、睡眠、挂起/停止。

    二、使用步骤

    2.1常规使用
    // 步骤1:创建线程类 (继承自Thread类)
      class MyThread extends Thread{
    
    // 步骤2:复写run(),内容 = 定义线程行为
       @Override
       public void run(){
       ... // 定义的线程行为
       }
    }
    
    // 步骤3:创建线程对象,即 实例化线程类
     MyThread mt=new MyThread(“线程名称”);
    
    // 步骤4:通过 线程对象 控制线程的状态,如 运行、睡眠、挂起  / 停止
    // 此处采用 start()开启线程
     mt.start();
    
    2.2 简便使用:匿名类

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

    // 步骤1:采用匿名类,直接 创建 线程类的实例
    new Thread("线程名称") {
       // 步骤2:复写run(),内容 = 定义线程行为
       @Override
       public void run() {       
       // 步骤3:通过 线程对象 控制线程的状态,如 运行、睡眠、挂起  / 停止   
       }
    }.start();
    
    2.3 区别
    2种方法本质相同,但是各有优劣势 & 不同的应用场景: image.png

    三、实例应用

    实例1

    • 应用场景:创建两个线程-实现两个相同的耗时任务
    • 实例说明:实现2个窗口同时卖火车票;每个窗口卖100张,卖票速度都是1s/张
    • 具体实现
      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();
    
                   }
               });
    
           }
       }
    
    
    

    测试结果

    image.png
    实例2
    • 应用场景:创建两个线程-实现两个不同的耗时任务
    • 实例说明:实现2个窗口同时卖火车票;每个窗口卖100张,但卖票速度不同:窗口1是1s/张,窗口2是3s/张
    • 具体实现
      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张。 image.png

    相关文章

      网友评论

          本文标题:Android 多线程 02 --- 继承Thread类 使用解

          本文链接:https://www.haomeiwen.com/subject/syxyyrtx.html