黑马程序员技术交流社区

标题: 线程卖票 恼火的很 [打印本页]

作者: 75100313    时间: 2013-12-18 06:27
标题: 线程卖票 恼火的很
package com.mth.synchronizedtest;

/*
* 本程序目的:解决卖重复票 还有 负数票的情况
*
*  
* */
public class SynchronizedTest1 implements Runnable {
        private int tickets = -1;

        @Override
        public void run() {
                for (int i = 0; i < 50; i++) {
                        synchronized (this) {
                                if (tickets > 0) {
                                        try {
                                                Thread.sleep(1000);
                                        } catch (InterruptedException e) {
                                                // TODO Auto-generated catch block
                                                e.printStackTrace();
                                        }
                                        System.out.println(Thread.currentThread().getName()
                                                        + "号窗口卖出" + this.tickets-- + "号票");

                                }
                        }
                }
        }

        public static void main(String[] args) {
                SynchronizedTest test = new SynchronizedTest();
                Thread t1 = new Thread(test);
                Thread t2 = new Thread(test);
                Thread t3 = new Thread(test);
                Thread t4 = new Thread(test);
                t1.start();
                t2.start();
                t3.start();
                t4.start();
        }

}





作者: 75100313    时间: 2013-12-18 06:29
为什么设置-1还能卖票呢?
作者: 75100313    时间: 2013-12-18 06:39
bug了 啊 啊啊啊啊啊 还是我哪里写的不对
作者: 四五六七八    时间: 2013-12-18 08:04
你定义的类名是SynchronizedTest1    在下面你创建对象时SynchronizedTest() 明显用的不是这个类   
作者: belief丶Only    时间: 2013-12-18 11:22
tickets = -1的时候你怎么可能卖票呢?除非是你改了之后没保存!
还有你的类名是SynchronizedTest1
应该声明的是类对象 SynchronizedTest1 test = new SynchronizedTest1();
你把这两个地方改一下应该没什么问题!
作者: smileven    时间: 2013-12-18 12:29
你定义的线程类是这样SynchronizedTest1
public class SynchronizedTest1 implements Runnable
但是你新建线程对象的时候用的却是SynchronizedTest
SynchronizedTest test = new SynchronizedTest();

新建了不同的线程对象,那么线程就会有不同的贡献数据。所以你的-1在这是不管用的。
你的当前文件目录里肯定有一个Synchronized.class的字节码文件,是你以前编译过的,所以才会执行。
不然这样一般是会报错的哦!以后要细心 ~~
作者: 75100313    时间: 2013-12-18 14:27
我晕 我错了 我也不知道 快捷键写的 我说怎么回事 感谢大伙
作者: 零敢    时间: 2013-12-18 14:28
本帖最后由 零敢 于 2013-12-18 14:33 编辑

class MyThread implements Runnable{
        private int ticket = 5 ;        // 假设一共有5张票
        public void run(){
                for(int i=0;i<100;i++){
                        this.sale() ;        // 调用同步方法
                }
        }
        public synchronized void sale(){        // 声明同步方法
                if(ticket>0){        // 还有票
                        try{
                                Thread.sleep(300) ;        // 加入延迟
                        }catch(InterruptedException e){
                                e.printStackTrace() ;
                        }
                        System.out.println("卖票:ticket = " + ticket-- );
                }

        }
};
public class SyncDemo03{
        public static void main(String args[]){
                MyThread mt = new MyThread() ;        // 定义线程对象
                Thread t1 = new Thread(mt) ;        // 定义Thread对象
                Thread t2 = new Thread(mt) ;        // 定义Thread对象
                Thread t3 = new Thread(mt) ;        // 定义Thread对象
                t1.start() ;
                t2.start() ;
                t3.start() ;
        }
};

你可以试试我这个;;你设置票=-1不知道你是什么意思........
这个应该是原始票数吧;
其实你如果用了同步代码块或者同步方法票数就不会变负数也不会卖重复票

作者: 75100313    时间: 2013-12-18 15:08
零敢 发表于 2013-12-18 14:28
class MyThread implements Runnable{
        private int ticket = 5 ;        // 假设一共有5张票
      ...

十分感谢  嗯




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2