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

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

程序描述:有三个窗口,同时随即卖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]

希望各位赐教!

参考
多线程讲解文章
http://blog.csdn.net/zuoluoboy/archive/2009/03/29/4034935.aspx

package practice;

import java.text.NumberFormat;

public class XianCheng {

    public static void main(String[] args) {
        RunnableA a = new RunnableA();
        new Thread(a).start();// 实例化线程并启动
        new Thread(a).start();// 实例化线程并启动
        new Thread(a).start();// 实例化线程并启动
    }
}

// 创建线程A
class RunnableA implements Runnable {
    int i =1;
    NumberFormat formatter = NumberFormat.getNumberInstance();

    public synchronized void run() {
        formatter.setMinimumIntegerDigits(3);//设置小数点前至少三位数值
        while (i < 10) {
            try {
                System.out.println(formatter.format(i));
                i++;
                Thread.sleep(1000);                    
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

}

这个和你的类似
http://www.iteye.com/problems/28430