上一篇文章:java多线程案例(1)之简单银行取款问题及其优化
我大概介绍了一下Java代码优化的问题,主要针对出学者而言,这一次我要介绍多线程应用的简单案例 。网上有许多多线程的案例,但大多都挺复杂的,今天我主要目的也是介绍一下多线程应用的简单案例,让初学者对多线程有初步了解。
大概案例:几个人同时在一个车站购票,车站分几个窗口,窗口同时售票100,每出售一张票就打印出来,车票售空停止打印。
对于拿到手的案例,应具体分析一下,几个人同时在窗口买票,如果没有多线程,会出现什么样的情况,如果加上多线程又会是一个怎么样的结果。现在我们就把这两种不同情况具体分析。
情况(1)没有多线程
如果没有多线程,不同的人在同一时刻只能在同一个线程下购票,可能会出现网络拥堵,每次只能一个人占用线程,只能一个人进行购票。
情况(2)有多线程
如果有多线程,不同的人购票时都有各自的线程,同一时刻购票,互不影响。但这里面又有Bug,至于这个Bug,下个博客将进行介绍分析。
主函数类:main.java
public class main {
/*主函数入口*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Station station=new Station();
Window window1=new Window("win1",2000);
window1.start();
Window window2=new Window("win2",2000);
window2.start();
Window window3=new Window("win3",2000);
window3.start();
Window window4=new Window("win4",2000);
window4.start();
}
}
车站类:Station.java
public class Station {
public static int ticket=100;
public static void buy_ticket(String win_name) {
ticket--;
System.out.print(win_name+"\n"+"发票数1:"+"剩余"+ticket+"\n");
}
}
窗口类:Window.java //继承多线程类Thread
public class Window extends Thread{
private String win;
private int deltime;
public Window(String win, int deltime) {
// TODO Auto-generated constructor stub
this.win=win;
this.deltime=deltime;
}
@Override
public void run() {
while(Station.ticket>0) {
Station.buy_ticket(win);
try {
sleep(deltime);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
具体运行效果:
以上运行效果中的Bug,也就是我在开头讲的Bug,下次博客将会进行介绍及给出解决。
以上工程具体代码可以在github下载:https://github.com/whitedouble/whitedouble.git