public class ThreadImpl01 extends Thread { private int ticket = 5; @Override public void run() { for (int i = 0; i < 10; i++) { if (ticket > 0) { System.out.println("[ThreadImpl01] = " + (ticket--) + " [Thread] = " + Thread.currentThread().getId()); } } } }
public class ThreadImpl02 implements Runnable { private int ticket = 5; @Override public void run() { for (int i = 0; i < 10; i++) { if (ticket > 0) { System.out.println("[ThreadImpl02] = " + ticket-- + " [Thread] = " + Thread.currentThread().getId()); } } } }
public class ThreadImpl03 implements Runnable { private int ticket = 5; @Override public void run() { synchronized (ThreadImpl03.class) { for (int i = 0; i < 10; i++) { if (ticket > 0) { try { Thread.sleep(200); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("[ThreadImpl03] = " + ticket-- + " [Thread] = " + Thread.currentThread().getId()); } } } } }
public class ThreadDemo { public static void main(String[] args) { /** * 實現Runnable接口相比繼承Thread類的優點: * 一、能夠避免因爲Java的單繼承特性而帶來的侷限; * 二、加強程序的健壯性,代碼可以被多個線程共享,代碼與數據是獨立的; * 三、適合多個相同程序代碼的線程區處理同一資源的狀況。 */ new ThreadImpl01().start(); new ThreadImpl01().start(); new ThreadImpl01().start(); ThreadImpl02 threadImpl02 = new ThreadImpl02(); new Thread(threadImpl02).start(); new Thread(threadImpl02).start(); new Thread(threadImpl02).start(); ThreadImpl03 threadImpl03 = new ThreadImpl03(); new Thread(threadImpl03).start(); new Thread(threadImpl03).start(); new Thread(threadImpl03).start(); } }