JAVA多線程實現方式主要有三種:繼承Thread類、實現Runnable接口、使用ExecutorService、Callable、Future實現有返回結果的多線程。其中前兩種方式線程執行完後都沒有返回值,只有最後一種是帶返回值的。本節,咱們將探討經常使用的實現多線程的2種方式:Thread和Runnable。至於第三種ExecutorService、Callable、Future的實現是屬於java.util.concurrent包下的內容,我將單獨設置一節去探討。java
Runnable是一個接口,該接口只包含了一個run無參方法。設計該接口的目的是爲但願在活動時執行代碼的對象提供一個公共協議。例如,Thread類實現了Runnable。激活的意思是說某個線程已經啓動而且還沒有中止。多線程
此外Runnable爲非Thread子類的類提供了一種激活方式。經過實例化某個Thread實例並將自身做爲運行目標,就能夠運行實現Runnable的類而無須建立Thread的子類。大多數狀況下,若是隻想重寫run()方法,而不重寫其餘Thread方法,那麼應使用Runnable接口。這很重要,由於除非程序猿打算修改或加強類的基本行爲,不然不該該建立子類。併發
package java.lang; public interface Runnable { public abstract void run(); }
Thread是程序中的執行線程。Java虛擬機容許程序併發地運行多個執行線程。ide
Thread是一個類。它實現了Runnable接口。學習
public class Thread implements Runnable {}
在程序開發中只要是多線程確定永遠以實現Runnable接口爲主,this
首先闡述實現Runnable的好處:spa
其次,Thread實現多線程方式是:多個線程完成本身的任務。而Runnable實現多線程的方式是:多個線程共同完成一個任務。這是由於Thread(線程)已是程序中的執行線程了。線程
該示例也能看出Thread和Runnable實現多線程的區別設計
package org.multithread.basic.realize; public class TestThread { public static void main(String[] args) { MyThread t1 = new TestThread().new MyThread(); MyThread t2 = new TestThread().new MyThread(); MyThread t3 = new TestThread().new MyThread(); t1.start(); t2.start(); t3.start(); } class MyThread extends Thread{ private int ticket =10; @Override public void run() { for(int i = 0;i<5;i++){ if(this.ticket > 0){ System.out.println(this.getName()+"出售:ticket"+this.ticket--); } } } }; }
運行結果:code
Thread-0出售:ticket10 Thread-2出售:ticket10 Thread-1出售:ticket10 Thread-2出售:ticket9 Thread-0出售:ticket9 Thread-0出售:ticket8 Thread-0出售:ticket7 Thread-0出售:ticket6 Thread-2出售:ticket8 Thread-1出售:ticket9 Thread-1出售:ticket8 Thread-1出售:ticket7 Thread-1出售:ticket6 Thread-2出售:ticket7 Thread-2出售:ticket6
結果說明:
對上個程序進行改造,以下:
package org.multithread.basic.realize; public class TestThread { public static void main(String[] args) { // MyThread t1 = new TestThread().new MyThread(); // MyThread t2 = new TestThread().new MyThread(); // MyThread t3 = new TestThread().new MyThread(); MyRunnable mr = new TestThread().new MyRunnable(); Thread t1 = new Thread(mr); Thread t2 = new Thread(mr); Thread t3 = new Thread(mr); t1.start(); t2.start(); t3.start(); } class MyThread extends Thread{ private int ticket =10; @Override public void run() { for(int i = 0;i<5;i++){ if(this.ticket > 0){ System.out.println(this.getName()+"出售:ticket"+this.ticket--); } } } }; class MyRunnable implements Runnable{ private int ticket = 10; @Override public void run() { // TODO Auto-generated method stub for(int i = 0;i<5;i++){ if(this.ticket > 0){ System.out.println(Thread.currentThread().getName()+"出售:ticket"+this.ticket--); } } } }; }
運行結果:
Thread-1出售:ticket10 Thread-1出售:ticket7 Thread-1出售:ticket6 Thread-2出售:ticket8 Thread-2出售:ticket4 Thread-2出售:ticket3 Thread-2出售:ticket2 Thread-2出售:ticket1 Thread-0出售:ticket9 Thread-1出售:ticket5
結果說明:
經過以上學習,咱們瞭解到實現多線程的兩種方式:繼承Thread和實現Runnable接口,可是記住一條:在多線程開發中,要以實現Runnable接口爲主,這是由於Java是單根繼承,能夠多個實現,繼承Thread的類不能再繼承其餘類。而且Thread是執行線程,每一個子線程之間相互獨立,資源不共享。