FusionInsight程序猿 2010-01-07 13:07
浏览 230
已采纳

使用多线程打印火车票的问题

第一次提问,不足之处希望赐教!我初学多线程,有很多问题想问问大家希望大家帮忙解决,谢谢了!

程序描述:有三个窗口,同时随即卖10张票。

碰到的问题:
1.在创建线程的时候new Thread(Runnable abc)和new TicketPrint()(我的例子)有什么区别么?我在做例子的时候用的后者建立线程,count在测试的时候打印出来都是1,我哪块出错了?难道要启动三个线程的话传入的runnable实现类要是同一实例?
2.在TicketPrint类中,如果 用注释部分1而不用注释部分2会导致线程一直等待,还有用现有的程序打印完票后eclipse中的程序显示为什么还是执行状态?最后一个线程没有被释放?如何释放?
3.程序在设计的时候施放线程锁用this.notifyAll(); 还是this.notify();好?个人感觉this.notifyAll(); ,因为为了使三个窗口随即打印,每次都得全部释放锁,所以我写了注释1的代码,但用用注释1部分的代码后程序又只打印三张票后停止。

我的例子:

TicketPrint.java
[code="java"]
package mine;

public class TicketPrint implements Runnable{

private int num =10;
//线程数目
private int count;

public void run(){
    System.out.println(Thread.currentThread().getName()+"号窗口开始工作");
    getTicket();
}

private void getTicket() {
    while(num > 0 ){
        synchronized (this) {
            count++;

            System.out.println(Thread.currentThread().getName()+"号窗口打印票:"+num);

            num--;

            //注释部分1

// try {
// this.wait();
// } catch (InterruptedException e1) {
// e1.printStackTrace();
// }

// this.notifyAll();
//注释部分1结束

            //注释部分2
            if(count < 3){
                try {
                    System.out.println(Thread.currentThread().getName()+"号窗口停止工作");
                    this.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }else{

                this.notifyAll();

                count=0 ;
            }
                        //注释部分2结束
        }

    }


}

}

[/code]

[code="java"]
package mine;

public class Main {

public static void main(String[] args) {
    TicketPrint t = new TicketPrint();
    Thread t1 = new Thread(t,"1");
    Thread t2 = new Thread(t,"2");
    Thread t3 = new Thread(t,"3");

// 这样生成实例为什么不能形成同时打印,并打印完票的过程
// Thread t1 = new Thread(new TicketPrint());
// Thread t2 = new Thread(new TicketPrint());
// Thread t3 = new Thread(new TicketPrint());

    t1.start();
    t2.start();
    t3.start();

}

}

[/code]

希望各位赐教!

  • 写回答

3条回答 默认 最新

  • wanghaolovezlq 2010-01-13 10:25
    关注
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?