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(); } }