Java基础----一个有问题的多线程程序
2014-12-30 08:49
190 查看
package cn.itcast_08; public class SellTicket implements Runnable { // 定义100张票 private int tickets = 100; // @Override // public void run() { // while (true) { // // t1,t2,t3三个线程 // // 这一次的tickets = 100; // if (tickets > 0) { // // 为了模拟更真实的场景,我们稍作休息 // try { // Thread.sleep(100); // t1就稍作休息,t2就稍作休息 // } catch (InterruptedException e) { // e.printStackTrace(); // } // // System.out.println(Thread.currentThread().getName() + "正在出售第" // + (tickets--) + "张票"); // // 理想状态: // // 窗口1正在出售第100张票 // // 窗口2正在出售第99张票 // // 但是呢? // // CPU的每一次执行必须是一个原子性(最简单基本的)的操作。 // // 先记录以前的值 // // 接着把ticket-- // // 然后输出以前的值(t2来了) // // ticket的值就变成了99 // // 窗口1正在出售第100张票 // // 窗口2正在出售第100张票 // // } // } // } @Override public void run() { while (true) { // t1,t2,t3三个线程 // 这一次的tickets = 1; if (tickets > 0) { // 为了模拟更真实的场景,我们稍作休息 try { Thread.sleep(100); //t1进来了并休息,t2进来了并休息,t3进来了并休息, } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + "正在出售第" + (tickets--) + "张票"); //窗口1正在出售第1张票,tickets=0 //窗口2正在出售第0张票,tickets=-1 //窗口3正在出售第-1张票,tickets=-2 } } } }
package cn.itcast_08; /* * 实现Runnable接口的方式实现 * * 通过加入延迟后,就产生了连个问题: * A:相同的票卖了多次 * CPU的一次操作必须是原子性的 * B:出现了负数票 * 随机性和延迟导致的 */ public class SellTicketDemo { public static void main(String[] args) { // 创建资源对象 SellTicket st = new SellTicket(); // 创建三个线程对象 Thread t1 = new Thread(st, "窗口1"); Thread t2 = new Thread(st, "窗口2"); Thread t3 = new Thread(st, "窗口3"); // 启动线程 t1.start(); t2.start(); t3.start(); } }
相关文章推荐
- 别人的Morgan Stanley面试,注重基础,java core、多线程、设计模式、设计程序。。。
- 迅雷笔试题 (JAVA多线程)启动三个线程,分别打印A B C,现在写一个程序 循环打印ABCABCABC
- 基础/Java基础/(2)一个完整的Java程序实例
- [基础题] 6.(*)按如下要求编写Java程序: (1)编写一个接口:OneToN,只含有一个方法int dispose(int n)
- Java - SpringMVC基础入门,创建一个HelloWorld程序
- 一个简单的多线程、断点下载Java程序
- Java基础知识强化之网络编程笔记14:TCP之多个客户端上传到一个服务器的思考(多线程改进)
- java基础--24.多线程的应用--电影院卖票程序的实现
- JAVA多线程程序开发基础知识
- Jenkins基础入门-10-新建一个执行java程序的Jenkins Job
- 多线程编程答案篇(C#和Java):解决pull和push模式在同一个程序中的冲突
- Java基础----多线程程序解决
- Java基础---Java---网络编程---TCP的传输、客户端和服务端的互访、建立一个文本转换器、编写一个聊天程序
- [Java 09 多线程] 线程是指一个进程在执行过程中可以产生更小的程序单元
- 写了一个从oracle导数据到hbase的多线程java程序,只要创建一个实体加上注解基本就可以导数据了
- 用Java Swing作一个日历控制程序-Java基础-Java-编程开发
- 如何使用Java编写多线程程序-Java基础-Java-编程开发
- JAVA基础笔记——多线程程序
- Java并行程序基础 --- 多线程及容错性处理
- 用Java写一个多线程程序,如写四个线程,二个加1,二个对一变量减一,输出: