你們都知道多線程能夠經過兩種方式來建立。 java
1、經過繼承Thread類 編程
2、經過實現Runnable接口 多線程
那麼中兩種方式到底有什麼區別呢?那種方式更好些呢? spa
咱們使用多線程,無非就是想利用多線程的優勢,來更好的實現咱們的想法。 線程
多線程有哪些優勢呢? 對象
1、多線程共享同一塊內存空間和一組系統資源 blog
2、線程自己的數據一般都是隻有微處理器的寄存器數據,以及供程序執行的堆棧。因此係統在產生一個線程或者線程的切換要比進程系統的負擔小不少。 繼承
如今咱們來了解一些Thread類。 接口
-
public class ThreadDemo 進程
- {
- public static void main(String []args)
- {
- ThreadTest t=new ThreadTest();
- t.start();
- t.start();
- t.start();
- t.start();
- }
- }
- class ThreadTest extends Thread
- {
- private int count=10;
- public void run()
- {
- while(count>0)
- {
- System.out.println(Thread.currentThread().getName()+" "+count--);
- }
- }
- }
運行後,咱們發現其實只啓動了一個線程。
是否是程序有問題呢?咱們修改一下程序。
- public class ThreadDemo
- {
- public static void main(String []args)
- {
- new ThreadTest().start();
- new ThreadTest().start();
- new ThreadTest().start();
- new ThreadTest().start();
- }
- }
- class ThreadTest extends Thread
- {
- private int count=10;
- public void run()
- {
- while(count>0)
- {
- System.out.println(Thread.currentThread().getName()+" "+count--);
- }
- }
- }
再次運行,發現這四個線程對象各自佔有各自的資源,並非同時完成統一任務。
咱們能夠得出結論:Thread類實際上沒法達到資源共享的目的。
那麼,Runnable接口能不能達到這一目的呢?
咱們大可試一下。
- public class ThreadDemo
- {
- public static void main(String []args)
- {
- ThreadTest test=new ThreadTest();
- new Thread(test).start();
- new Thread(test).start();
- new Thread(test).start();
- new Thread(test).start();
- }
- }
- class ThreadTest implements Runnable
- {
- private int count=10;
- public void run()
- {
- while(count>0)
- {
- System.out.println(Thread.currentThread().getName()+" "+count--);
- }
- }
- }
運行以後咱們發現,這四個線程同時完成了咱們須要完成的任務。
經過以上比較咱們便可得出Thread與Runnable的區別:
一、Runnable適合於多個相同程序代碼線程去處理統一資源的狀況,把虛擬的cpu(線程)同程序的代碼,數據有效分離,較好體現面向對象的編程的思想
二、Runnable能夠避免因爲java的單繼承機制帶來的侷限。能夠再繼承其餘類的同時,還能實現多線程的功能。
三、Runnable能增長程序的健壯性。代碼可以被多個線程共享。