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
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(); } } } }
new MyThread().start();
二.Runnable
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
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(); } } } }
new Thread(new MyRunnable()).start();
Thread thread = new Thread(new MyRunnable()); thread.start();
四.匿名内部类
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启动线程
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(); } }