package com.supinfo.java;
class Window1 implements Runnable{
int tickets = 300;
@Override
public void run() {
while(true){
if(tickets>0){
try {
Thread.currentThread().sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+",售票,票号为:"+tickets--);
}else{
break;
}
}
}
}
public class TestWindow2 {
public static void main(String[] args) {
Window1 w1 = new Window1();
Thread t1 = new Thread(w1);
t1.setName("窗口1");
Thread t2 = new Thread(w1);
t2.setName("窗口2");
Thread t3 = new Thread(w1);
t3.setName("窗口3");
t1.start();
t2.start();
t3.start();
}
}结果会有重票和错票,错票比较好理解,哪位大神给我解释下,为什么有重票的情况发生。
class Window1 implements Runnable{
int tickets = 300;
@Override
public void run() {
while(true){
if(tickets>0){
try {
Thread.currentThread().sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+",售票,票号为:"+tickets--);
}else{
break;
}
}
}
}
public class TestWindow2 {
public static void main(String[] args) {
Window1 w1 = new Window1();
Thread t1 = new Thread(w1);
t1.setName("窗口1");
Thread t2 = new Thread(w1);
t2.setName("窗口2");
Thread t3 = new Thread(w1);
t3.setName("窗口3");
t1.start();
t2.start();
t3.start();
}
}结果会有重票和错票,错票比较好理解,哪位大神给我解释下,为什么有重票的情况发生。
volatile试试,关于并发编程可以看看这个http://www.cnblogs.com/dolphin0520/p/3920373.html
/**
* @Description
* 设计一个多线程程序如下:
* 设计一个火车售票模拟程序。 假如火车站要有100张火车票要卖出,
* 现在有5个售票点同时售票,用5个线程模拟这5个售票点的售票情况
* 1、要求打印出每个售票点所卖出的票号
* 2、各售票点不能售出相同票号的火车票
* @author XPY
* @date 2016年7月4日下午5:40:40
*/
public class ThreadTest3 {
public static void main(String[] args) {
Shop shop = new Shop();
for (int i = 1; i <= 5; i++) {
new Thread(shop,"").start();
}
}
}class Shop implements Runnable{
String name;
ticket t;
public Shop() {
t.total = 100;
t.count = 0;
} public void run() {
while (t.total>0) {
synchronized (this) {
try {
Thread.sleep(new Random().nextInt(1000));
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"_____"+t.count);
t.total--;
t.count++;
}
} }
}class ticket {
int total;
int count;
}我写的一个小例子 ,你可以看看就知道为什么了