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

2022-05-20  本文已影响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

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
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
上一篇下一篇

猜你喜欢

热点阅读