法①:继承Thread类
package com.thread.demo;
/**
*
* <p>
* Title: Ticket_Thread_Demo
* </p>
* <p>
* Description: 100张票通过四个售票厅售出
* </p>
* <p>
* Company: buaa
* </p>
*
* @author 夜色
* @date 2016年11月28日
*/
public class Ticket_Thread_Demo {
public static void main(String[] args) {
Ticket ticket1 = new Ticket();
Ticket ticket2 = new Ticket();
Ticket ticket3 = new Ticket();
Ticket ticket4 = new Ticket();
ticket1.setName("售票厅1");
ticket2.setName("售票厅2");
ticket3.setName("售票厅3");
ticket4.setName("售票厅4");
ticket1.start();
ticket2.start();
ticket3.start();
ticket4.start();
}
}
class Ticket extends Thread {
private static int ticketNum = 100;
public void run() {
synchronized (Ticket.class) {
while (true) {
if (ticketNum == 0)
break;
System.out.println(getName() + "售出了第" + ticketNum-- + "张票");
}
}
}
}
法②:实现Runnable接口
package com.runnable.demo;
/**
*
* <p>
* Title: Ticket_Runnable_Demo
* </p>
* <p>
* Description: 100张票通过四个售票厅售出
* </p>
* <p>
* Company: buaa
* </p>
*
* @author 夜色
* @date 2016年11月28日
*/
public class Ticket_Runnable_Demo {
public static void main(String[] args) {
Ticket ticket = new Ticket();
new Thread(ticket, "售票厅1").start();
new Thread(ticket, "售票厅2").start();
new Thread(ticket, "售票厅3").start();
new Thread(ticket, "售票厅4").start();
}
}
class Ticket implements Runnable {
private int ticketNum = 100;
public void run() {
synchronized (this) {
while (true) {
if (ticketNum == 0)
break;
System.out.println(Thread.currentThread().getName() + "售出了第" + ticketNum-- + "张票");
}
}
}
}
细节方面还是略有不同的