java多线程入门四

编程技术  /  houtizong 发布于 3年前   82
      举了生产者/消费者模型的例子,感觉还不过瘾,多线程在现实生活中的应用实在是太多太多了.下面我运用多线程解决火车站售票窗口售票这一实例.
      火车站销售火车票,对于每个售票窗口的机器,我们看其为一个线程,我们来实现一下用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张


     

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!

留言需要登陆哦

技术博客集 - 网站简介:
前后端技术:
后端基于Hyperf2.1框架开发,前端使用Bootstrap可视化布局系统生成

网站主要作用:
1.编程技术分享及讨论交流,内置聊天系统;
2.测试交流框架问题,比如:Hyperf、Laravel、TP、beego;
3.本站数据是基于大数据采集等爬虫技术为基础助力分享知识,如有侵权请发邮件到站长邮箱,站长会尽快处理;
4.站长邮箱:[email protected];

      订阅博客周刊 去订阅

文章归档

文章标签

友情链接

Auther ·HouTiZong
侯体宗的博客
© 2020 zongscan.com
版权所有ICP证 : 粤ICP备20027696号
PHP交流群 也可以扫右边的二维码
侯体宗的博客