java多线程入门四
举了生产者/消费者模型的例子,感觉还不过瘾,多线程在现实生活中的应用实在是太多太多了.下面我运用多线程解决火车站售票窗口售票这一实例.
火车站销售火车票,对于每个售票窗口的机器,我们看其为一个线程,我们来实现一下用4个线程销售完5张票.
火车票:
package ticket;
public class Ticket extends Thread {
private int ticket = 5;// 定义总的票数目
public void run() {
// 循环,每卖出一张票,即打印一次
while (ticket < 6) {
// 同步块
synchronized (this) {
if (ticket > 0) {
try {
Thread.sleep(1);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "已售出"
+ "1张票" + " " + "余票为" + --ticket + "张");
} else
return;
}
}
}
}
测试类:
public class Test {
public static void main(String[] args) {
Thread t1 = new Ticket();
Thread t2 = new Ticket();
Thread t3 = new Ticket();
Thread t4 = new Ticket();
t1.setName("1号售票口");
t2.setName("2号售票口");
t3.setName("3号售票口");
t4.setName("4号售票口");
t1.start();
t2.start();
t3.start();
t4.start();
}
}
运行结果:
4号售票口已售出1张票 余票为4张
1号售票口已售出1张票 余票为4张
3号售票口已售出1张票 余票为4张
2号售票口已售出1张票 余票为4张
4号售票口已售出1张票 余票为3张
1号售票口已售出1张票 余票为3张
3号售票口已售出1张票 余票为3张
2号售票口已售出1张票 余票为3张
3号售票口已售出1张票 余票为2张
4号售票口已售出1张票 余票为2张
2号售票口已售出1张票 余票为2张
1号售票口已售出1张票 余票为2张
4号售票口已售出1张票 余票为1张
1号售票口已售出1张票 余票为1张
2号售票口已售出1张票 余票为1张
3号售票口已售出1张票 余票为1张
4号售票口已售出1张票 余票为0张
1号售票口已售出1张票 余票为0张
3号售票口已售出1张票 余票为0张
2号售票口已售出1张票 余票为0张
很明显,没能达到要求,因为我们要处理的是5张票,而售票窗口却当作每人都有5张票.经验:我们对于采用相同的方法(即操作方式或行为一样)处理同一资源(共享),我们建议采用实现Runnable接口,于是,如下实现上例.
火车票:
package ticket;
public class Ticket implements Runnable {
private int ticket = 5;// 定义总的票数目
public void run() {
// 循环,每卖出一张票,即打印一次
while (true) {
// 同步块
synchronized (this) {
if (ticket > 0) {
try {
Thread.sleep(1);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "已售出"
+ "1张票" + " " + "余票为" + --ticket + "张");
}
}
}
}
}
测试类:
package ticket;
public class Test {
public static void main(String[] args) {
//同一资源ticket
Ticket t = new Ticket();
Thread t1 = new Thread(t);
Thread t2 = new Thread(t);
Thread t3 = new Thread(t);
Thread t4 = new Thread(t);
//设定线程名称
t1.setName("1号售票口");
t2.setName("2号售票口");
t3.setName("3号售票口");
t4.setName("4号售票口");
t1.start();
t2.start();
t3.start();
t4.start();
}
}
运行结果:
1号售票口已售出1张票 余票为4张
2号售票口已售出1张票 余票为3张
3号售票口已售出1张票 余票为2张
4号售票口已售出1张票 余票为1张
1号售票口已售出1张票 余票为0张