Andorid 多线程(一):Thread 基本使用
线程的基本使用
觅思.澈 Thread 与 Runnable 对比 https://www.cnblogs.com/gw811/archive/2012/10/15/2724882.html
为什么Java要提供两种方法来创建线程呢?它们都有哪些区别?相比而言,哪一种方法更好呢?
在Java中,类仅支持单继承,也就是说,当定义一个新的类的时候,它只能扩展一个外部类.这样,如果创建自定义线程类的时候是通过扩展 Thread类的方法来实现的,
那么这个自定义类就不能再去扩展其他的类,也就无法实现更加复杂的功能。因此,如果自定义类必须扩展其他的类,
那么就可以使用实现Runnable接口的方法来定义该类为线程类,这样就可以避免Java单继承所带来的局限性。
实现Runnable接口相对于扩展Thread类来说,具有无可比拟的优势。这种方式不仅有利于程序的健壮性,使代码能够被多个线程共享,而且代码和数据资源相对独立,
从而特别适合多个具有相同代码的线程去处理同一资源的情况。这样一来,线程、代码和数据资源三者有效分离,很好地体现了面向对象程序设计的思想。因此,
几乎所有的多线程程序都是通过实现Runnable接口的方式来完成的。
一.extends Thread
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | package com.gatsby.crushthread; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.activity_main); new MyThread().start(); } } class MyThread extends Thread { int i = 1 ; @Override public void run() { while (i < 100 ) { Log.d( "gatsby" , "i->" + (i++)); try { Thread.sleep( 1000 ); } catch (InterruptedException e) { e.printStackTrace(); } } } } |
1 | new MyThread().start(); |
二.Runnable
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | package com.gatsby.crushthread; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.activity_main); MyRunnable(); } public void MyRunnable() { Runnable runnable = new Runnable() { @Override public void run() { int i = 1 ; while (i < 100 ) { Log.d( "gatsby" , "i->" + i++); try { Thread.sleep( 1000 ); } catch (InterruptedException e) { e.printStackTrace(); } } } }; Thread thread = new Thread(runnable); thread.start(); } } |
三.implents Runnable
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | package com.gatsby.crushthread; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.activity_main); new Thread( new MyRunnable()).start(); } } class MyRunnable implements Runnable { int i = 1 ; @Override public void run() { while (i < 100 ) { Log.d( "gatsby" , "i->" + i++); try { Thread.sleep( 1000 ); } catch (InterruptedException e) { e.printStackTrace(); } } } } |
1 | new Thread( new MyRunnable()).start(); |
1 2 | Thread thread = new Thread( new MyRunnable()); thread.start(); |
四.匿名内部类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | package com.gatsby.crushthread; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.activity_main); new Thread( new Runnable() { @Override public void run() { int i = 1 ; while (i < 100 ) { Log.d( "gatsby" , "i->" + i++); try { Thread.sleep( 1000 ); } catch (InterruptedException e) { e.printStackTrace(); } } } }).start(); } } |
五.通过Handler启动线程
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | package com.gatsby.threadtest; import android.os.Bundle; import android.os.Handler; import android.util.Log; import androidx.appcompat.app.AppCompatActivity; public class MainActivity extends AppCompatActivity { private int count = 0 ; private Handler mHandler = new Handler(); private Runnable mRunnable = new Runnable() { public void run() { Log.d( "gatsby" , Thread.currentThread().getName() + "->" + count); count++; setTitle( "" + count); mHandler.postDelayed(mRunnable, 1000 ); //给自己发送消息,自运行 } }; @Override protected void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 通过Handler启动线程 mHandler.post(mRunnable); //发送消息,启动线程运行 } @Override protected void onDestroy() { //将线程销毁掉 mHandler.removeCallbacks(mRunnable); super .onDestroy(); } } |
分类:
Android Basics
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】