第一次提问,不足之处希望赐教!我初学多线程,有很多问题想问问大家希望大家帮忙解决,谢谢了!
程序描述:有三个窗口,同时随即卖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]
希望各位赐教!