• Android多线程实现


    Android基础的多线程实现方式主要有两种,一种是创建一种线程类并直接继承Thread类,重写其run函数实现线程功能,第二种是实现Runnable接口,通过线程辅助类实现线程功能。

    继承Thread类

    该方式实现的方法比较简单:

    1.自定义一个类,令该类继承Thread类。

    2.在该类中重写run方法,在其中实现线程的功能。

    3.实例化该类,调用start方法启动线程

    代码实例

    假设使用两个线程进行计数操作,可以通过该方法实现:

    1. package com.example.threadtest;
    2. import androidx.appcompat.app.AppCompatActivity;
    3. import android.os.Bundle;
    4. import android.util.Log;
    5. import android.view.View;
    6. import android.widget.Button;
    7. public class MainActivity extends AppCompatActivity {
    8. Button button;
    9. //自定义一个内部类
    10. private class MyThread extends Thread{
    11. private int number = 0;
    12. private String mName;
    13. private int mTime;
    14. //构造函数
    15. public MyThread(String name,int time){
    16. mName = name;
    17. mTime = time;
    18. }
    19. //重写run方法,实现计数功能
    20. @Override
    21. public void run(){
    22. while(number<99){
    23. number++;
    24. System.out.println(mName + " " +number);
    25. //延时计数
    26. try {
    27. Thread.sleep(mTime);
    28. } catch (InterruptedException e) {
    29. e.printStackTrace();
    30. }
    31. }
    32. }
    33. }
    34. @Override
    35. protected void onCreate(Bundle savedInstanceState) {
    36. super.onCreate(savedInstanceState);
    37. setContentView(R.layout.activity_main);
    38. //按下按钮之后启动线程
    39. button = (Button) findViewById(R.id.button);
    40. button.setOnClickListener(new View.OnClickListener(){
    41. @Override
    42. public void onClick(View v){
    43. //实例化两个线程对象
    44. MyThread t1 = new MyThread("thread1",1000);
    45. MyThread t2 = new MyThread("thread2",2000);
    46. //启动线程,线程run函数执行完自动结束线程
    47. t1.start();
    48. t2.start();
    49. }
    50. });
    51. }
    52. }

    除了显式定义一个类,也可以使用匿名类直接创建一个Thread对象并在其中重写run函数。

    匿名类相比显式定义类,使用更方便简洁,但是失去了复用性,适合于一次性启用的线程。

    方法特点

    使用自定义类继承Thread类的方法的优点是实现比较简单。

    缺点是占用了自定义类的继承名额(java只能单继承),减少了可扩展性;由于一个线程是一个实例对象,不适合资源共享的场景。当线程数量多时多次创建与销毁耗费大量资源。

    实现Runnable接口

    该方法的实现方式相对复杂一些:

    1.自定义一个类,该类实现Runnable接口,该类是线程辅助类,并不是真正的线程类。

    2.重写类里的run函数,实现线程功能。

    3.实例化该类。

    4.将该类对象作为参数,实例化Thread类。

    5.启动线程

    代码实例

    这次我们实现共享变量,令两个线程对同一个变量进行计数:

    1. package com.example.threadtest2;
    2. import androidx.appcompat.app.AppCompatActivity;
    3. import android.os.Bundle;
    4. import android.view.View;
    5. import android.widget.Button;
    6. public class MainActivity extends AppCompatActivity {
    7. Button button;
    8. //创建线程类,实现Runnable接口
    9. private class MyThread implements Runnable{
    10. //变量资源是共享的
    11. private int number = 0;
    12. //重写run方法,实现线程功能
    13. @Override
    14. public void run(){
    15. while (number<99){
    16. number++;
    17. System.out.println(Thread.currentThread().getName()+" "+number);
    18. //延时计数
    19. try {
    20. Thread.sleep(1000);
    21. } catch (InterruptedException e) {
    22. e.printStackTrace();
    23. }
    24. }
    25. }
    26. }
    27. @Override
    28. protected void onCreate(Bundle savedInstanceState) {
    29. super.onCreate(savedInstanceState);
    30. setContentView(R.layout.activity_main);
    31. //按下按钮启动线程
    32. button = (Button) findViewById(R.id.button);
    33. button.setOnClickListener(new View.OnClickListener() {
    34. @Override
    35. public void onClick(View view) {
    36. //由于是共用资源,因此只需要实例化一个线程辅助类
    37. MyThread mt = new MyThread();
    38. //实例化两个线程
    39. Thread t1 = new Thread(mt,"Thread1");
    40. Thread t2 = new Thread(mt,"Thread2");
    41. //启动线程
    42. t1.start();
    43. t2.start();
    44. }
    45. });
    46. }
    47. }

    线程辅助类通用可以使用匿名类的方式进行实例化。

    匿名类相比显式定义类,使用更方便简洁,但是失去了复用性,适合于一次性启用的线程。

    方法特点:

    该方案的优点是实现了线程间资源的共享;并且不占用继承名额。

    缺点是写法稍微复杂了一些。

    综上,如果需要修改或者增强Thread的子类,应采用第一种方法,否则采用第二种方法。

  • 相关阅读:
    .NET混合开发解决方案12 网页JS调用C#方法访问WinForm或WPF窗体
    分类预测 | MATLAB实现PCA-GRU(主成分门控循环单元)分类预测
    什么是粘包和拆包,Netty如何解决粘包拆包?
    【正点原子STM32连载】第十九章 窗口门狗(WWDG)实验 摘自【正点原子】MiniPro STM32H750 开发指南_V1.1
    猿创征文 | 国产数据库之在k8s环境下部署RadonDB MySQL集群
    带团队后的日常思考(十二)
    C++11简单介绍
    【新书推荐】AI时代,当程序员遇到ChatGPT,开发效率飞起来!
    【C++设计模式之责任链模式:行为型】分析及示例
    VBox启动失败、Genymotion启动失败、Vagrant迁移
  • 原文地址:https://blog.csdn.net/m0_37872216/article/details/126389241