首先講一下進程和線程的區別:java
進程:每一個進程都有獨立的代碼和數據空間(進程上下文),進程間的切換會有較大的開銷,一個進程包含1--n個線程。多線程
線程:同一類線程共享代碼和數據空間,每一個線程有獨立的運行棧和程序計數器(PC),線程切換開銷小。ide
線程和進程同樣分爲五個階段:建立、就緒、運行、阻塞、終止。測試
多進程是指操做系統能同時運行多個任務(程序)。this
多線程是指在同一程序中有多個順序流在執行。spa
在java中要想實現多線程,有兩種手段,一種是繼續Thread類,另一種是實現Runable接口。操作系統
public class Main { public static void main(String[] args) { MyThread T1 = new MyThread("A"); MyThread T2 = new MyThread("B"); T1.start(); T2.start(); } } class MyThread extends Thread { private String name; public MyThread(String name) { this.name = name; } @Override public void run() { for (int i = 0; i < 5; i++) { System.out.println(name+":"+i); try { sleep(1000); //休眠1秒,避免太快致使看不到同時執行 } catch (InterruptedException e) { e.printStackTrace(); } } } }
輸出:線程
A:0
B:0
A:1
B:1
B:2
A:2
B:3
A:3
A:4
B:4設計
若是一個類繼承Thread,則不適合資源共享。可是若是實現了Runable接口的話,則很容易的實現資源共享。code
public class Main { public static void main(String[] args) { //測試Runnable MyThread1 t1 = new MyThread1(); new Thread(t1).start();//同一個t1,若是在Thread中就不行,會報錯 new Thread(t1).start(); new Thread(t1).start(); } } class MyThread1 implements Runnable{ private int ticket = 10; @Override //記得要資源公共,要在run方法以前加上synchronized關鍵字,要否則會出現搶資源的狀況 public synchronized void run() { for (int i = 0; i <10; i++) { if (this.ticket>0) { System.out.println("賣票:ticket"+this.ticket--); } } } }
輸出:
賣票:ticket10
賣票:ticket9
賣票:ticket8
賣票:ticket7
賣票:ticket6
賣票:ticket5
賣票:ticket4
賣票:ticket3
賣票:ticket2
賣票:ticket1
這裏要注意每一個線程都是用同一個實例化對象,若是不是同一個,效果就和上面的同樣了!
總結:
實現Runnable接口比繼承Thread類所具備的優點:
1):適合多個相同的程序代碼的線程去處理同一個資源
2):能夠避免java中的單繼承的限制
3):增長程序的健壯性,代碼能夠被多個線程共享,代碼和數據獨立