售票时若要保持数据的准确,需要使得所有的售票窗口的线程的Runnable是同一个对象,且该对象的数据处理是设置为同步的。
即:
Runnable MyRun=new MyRunnable();
Thread window1=new Thread(MyRun);
Thread window2=new Thread(MyRun);
import java.util.logging.Level;
import java.util.logging.Logger;
/**
*
* @author qaz22
*/
public class 线程分组 {
public static void main(String[] args) {
ThreadGroup MeiZhouSite=new ThreadGroup("MeiZhouSite");//建立线程组
MeiZhouTicketExchange TicketExchange= new MeiZhouTicketExchange();
Thread window1=new Thread(TicketExchange, "MeiZhouSite-window1");
Thread window2=new Thread(TicketExchange, "MeiZhouSite-window2");
window1.start();
window2.start();
try {
Thread.sleep(10000);//交易时间
} catch (InterruptedException ex) {
Logger.getLogger(线程分组.class.getName()).log(Level.SEVERE, null, ex);
}
MeiZhouSite.stop();//不能控制??
if (window1.isAlive()) {
System.out.println("Alive");
window1.stop();
}
if (window2.isAlive()) {
System.out.println("Alive");
window2.stop();
}
System.out.println("交易结束");
}
}
class MeiZhouTicketExchange implements Runnable{
long TicketNumber=100000;
@Override
public void run() {
while(TicketNumber>=0){
Pay();
}
}
private synchronized void Pay() {
TicketNumber--;
System.out.println(Thread.currentThread().getThreadGroup().getName()+"的窗口"+Thread.currentThread().getName()+"售出1张票,剩余票有"+TicketNumber);
try {
Thread.sleep(100);
} catch (InterruptedException ex) {
Logger.getLogger(线程分组.class.getName()).log(Level.SEVERE, null, ex);
}
}
}