實現Runnable接口和繼承Thread類區別

若是一個類繼承Thread,則不適合資源共享。可是若是實現了Runable接口的話,則很容易的實現資源共享。java

實現Runnable接口比繼承Thread類所具備的優點:多線程

1):適合多個相同的程序代碼的線程去處理同一個資源dom

2):能夠避免java中的單繼承的限制jvm

3):增長程序的健壯性,代碼能夠被多個線程共享,代碼和數據獨立ide

直接看代碼:學習

一、繼承Thread的demothis

package com.multithread.learning;
/**
 *多線程學習,繼承Thread,資源不能共享
 *@author
 */
class Thread1 extends Thread{
	private int count=5;
	private String name;
    public Thread1(String name) {
       this.name=name;
    }
	public void run() {
        for (int i = 0; i < 5; i++) {
            System.out.println(name + "運行  count= " + count--);
            try {
                sleep((int) Math.random() * 10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
       
	}
}

public class Main {

	public static void main(String[] args) {
		Thread1 mTh1=new Thread1("A");
		Thread1 mTh2=new Thread1("B");
		mTh1.start();
		mTh2.start();
	}
}
二、實現Runnable的demo
/**
 *多線程學習 實現runnable,資源能共享
 *@author 
 */
package com.multithread.runnable;
class Thread2 implements Runnable{
    private int count=15;
	@Override
	public void run() {
		  for (int i = 0; i < 5; i++) {
			  System.out.println(Thread.currentThread().getName() + "運行  count= " + count--);
	            try {
	            	Thread.sleep((int) Math.random() * 10);
	            } catch (InterruptedException e) {
	                e.printStackTrace();
	            }
	        }
	}
	
}
public class Main {

	public static void main(String[] args) {
		Thread2 mTh = new Thread2();
	        new Thread(mTh, "C").start();//同一個mTh,可是在Thread中就不能夠,若是用同一個實例化對象mt,就會出現異常   
	        new Thread(mTh, "D").start();
	        new Thread(mTh, "E").start();
	}
}
//這裏要注意每一個線程都是用同一個實例化對象,若是不是同一個,效果就和上面的同樣了!

提醒一下你們:main方法其實也是一個線程。在java中全部的線程都是同時啓動的,至於何時,哪一個先執行,徹底看誰先獲得CPU的資源。spa

java中,每次程序運行至少啓動2個線程。一個是main線程,一個是垃圾收集線程。由於每當使用java命令執行一個類的時候,實際上都會啓動一個jvm,每個jvm實際上就是在操做系統中啓動了一個進程。操作系統

相關文章
相關標籤/搜索