Thread和Runnable的区别

    xiaoxiao2022-07-02  99

    直接代码:

    activity:

    import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.view.View; import android.widget.TextView; import dayin.com.myapplication.R; /** * Created by lake * 此类的功能:多线程测试 */ public class Duoxiancheng extends AppCompatActivity { private TextView thread,thread1, runnable; private String TAG = "多线程测试"; private int tickets = 5; private class RunnAble implements Runnable { private String name; private int tickets = 5; public RunnAble(String name) { this.name = name; } @Override public synchronized void run() { //实现run方法 for (int i = 0; i <= 5; i++) { if (tickets > 0) { Log.e(TAG, ":::Runnable--卖出票: " + tickets-- + name); } } } } public class NewThread extends Thread { private String name; private int tickets = 5; public NewThread(String name) { this.name = name; } public void run() { for (int i = 0; i < 5; i++) { if (tickets > 0) { Log.e(TAG, ":::Thread--卖出票: " + tickets-- + name); } } } } @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_duoxiancheng); thread = findViewById(R.id.thread); thread1 = findViewById(R.id.thread1); runnable = findViewById(R.id.runnable); runnable.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { tickets = 5; RunnAble myRunnable = new RunnAble("测试RunnAble"); Thread thread1 = new Thread(myRunnable, "窗口一"); Thread thread2 = new Thread(myRunnable, "窗口二"); Thread thread3 = new Thread(myRunnable, "窗口三"); thread1.start(); thread2.start(); thread3.start(); } }); thread.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { tickets = 5; //测试thread NewThread s1 = new NewThread("Thread线程1"); NewThread s2 = new NewThread("Thread线程2"); NewThread s3 = new NewThread("Thread线程3"); new Thread(s1).start(); new Thread(s2).start(); new Thread(s3).start(); } }); thread1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { tickets = 5; //测试thread NewThread myThread = new NewThread("测试thread1"); Thread thread1 = new Thread(myThread, "窗口一"); Thread thread2 = new Thread(myThread, "窗口二"); Thread thread3 = new Thread(myThread, "窗口三"); thread1.start(); thread2.start(); thread3.start(); } }); } }

    布局:

    <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <TextView android:id="@+id/thread" android:text="thread" android:textSize="30dp" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:gravity="center"/> <TextView android:id="@+id/thread1" android:text="thread1" android:textSize="30dp" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:gravity="center"/> <TextView android:id="@+id/runnable" android:text="runnable" android:textSize="30dp" android:gravity="center" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1"/> </LinearLayout>

     

    总结:

    实现Runnable接口比继承Thread类所具有的优势:

    1):适合多个相同的程序代码的线程去处理同一个资源

    2):可以避免java中的单继承的限制

    3):增加程序的健壮性,代码可以被多个线程共享,代码和数据独立

    4):看源码可知,Thread也是实现了Runnable接口

     

     

    ps:thread1的点击事件中输出的结果和实现Runnable的结果是一样的,个人觉得,thread1中的是单线程,而非多线程,只是猜测,如果有不同意见的可以留言。

    最新回复(0)