/**
* 多线程案例 两种方式 模拟买票程序(不考虑线程安全问题)
*/
public class ThreadTest {
public static void main(String[] args) {
System.out.println(Thread.currentThread().getName() + " main run start");
//方式1
/**
* 模拟4个售票窗口售票
*/
// Ticket test1 = new Ticket();
// Ticket test2 = new Ticket();
// Ticket test3 = new Ticket();
// Ticket test4 = new Ticket();
// test1.start();
// test2.start();
// test3.start();
// test4.start();
//方式2
TestImpl ti1 = new TestImpl();
TestImpl ti2 = new TestImpl();
TestImpl ti3 = new TestImpl();
TestImpl ti4 = new TestImpl();
new Thread(ti1).start();
new Thread(ti2).start();
new Thread(ti3).start();
new Thread(ti4).start();
System.out.println(Thread.currentThread().getName() + " main run finished");
}
}
/**
* 方式1 继承Thread类重写run方法
*/
class Ticket extends Thread {
private static int ticketCount = 100;
@Override
public void run() {
while (ticketCount > 0) {
System.out.println(Thread.currentThread().getName() + " extends run tickNum" + ticketCount--);
}
}
}
/**
* 方式1 实现Runnable接口
*/
class TestImpl implements Runnable {
private Object obj = new Object();
private static int ticketCount = 100;
@Override
public void run() {
while (ticketCount > 0) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
sale();
}
}
/**
* 使用同步代码块解决多线程安全问题
*/
public void sale() {
synchronized (this) {
if (ticketCount > 0) {
System.out.println(Thread.currentThread().getName() + "还剩" + (ticketCount) + "张票");
ticketCount--;
}
}
}
}