public class Xiti { /**
 * @param args
 */
public static void main(String[] args) {
// TODO Auto-generated method stub
//创建一个窗口
TicketWindow tw1=new TicketWindow();
//TicketWindow tw2=new TicketWindow();
//TicketWindow tw3=new TicketWindow();
//使用三个线程同时启动
Thread t1=new Thread(tw1);
Thread t2=new Thread(tw1);
Thread t3=new Thread(tw1);
t1.start();
t2.start();
t3.start();
}}
//售票窗口类
class TicketWindow implements Runnable
{
//一共两千张
private int nums=2000; @Override
public void run() {
// TODO Auto-generated method stub
while(true)
{
//认为if else 要保证其原子性[同步代码块]
synchronized(this)
{


if(nums>0)
{
//Thread.currentThread().getName() 表示当前线程的名字
System.out.println
(Thread.currentThread().getName()+"现在售出第"+nums+"张票");
//休眠时间
try{
Thread.sleep(1000);
}
catch(Exception e)
{
e.printStackTrace();
}
nums--;
}else{
break;
}
}
}

       
}
}
Thread-0现在售出第2000张票
Thread-0现在售出第1999张票
Thread-2现在售出第1998张票
Thread-2现在售出第1997张票
Thread-2现在售出第1996张票
Thread-2现在售出第1995张票
以上是测试结果
我想的结果应该是
Thread-0现在售出第2000张票
Thread-1现在售出第1999张票
Thread-2现在售出第1998张票
Thread-0现在售出第1997张票
Thread-1现在售出第1996张票
Thread-2现在售出第1995张票
无限循环
求帮忙

解决方案 »

  1.   


    import java.util.List;public class ProcessCall {    /**
         * @param args
         */
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            // 创建一个窗口
            // TicketWindow tw2=new TicketWindow();
            // TicketWindow tw3=new TicketWindow();
            // 使用三个线程同时启动
            Thread t1 = new TicketWindow();
            Thread t2 = new TicketWindow();
            Thread t3 = new TicketWindow();
            t1.setPriority(4);
            t2.setPriority(3);
            t3.setPriority(2);
            TicketWindow.joinGroup(t1);
            TicketWindow.joinGroup(t2);
            TicketWindow.joinGroup(t3);
            t1.start();
            t2.start();
            t3.start();
        }}// 售票窗口类
    class TicketWindow extends Thread{
        // 一共两千张
        static List<Thread> list = null;
        public TicketWindow(){
            list = new ArrayList<Thread>();
        }
        public static void joinGroup(Thread t){
            list.add(t);
        }
        
        private int nums = 2000;    @Override
        public void run() {
            // TODO Auto-generated method stub
            while (true) {
                // 认为if else 要保证其原子性[同步代码块]
                synchronized (this) {
                    if (nums > 0) {
                        // Thread.currentThread().getName() 表示当前线程的名字
                        System.out.println(Thread.currentThread().getName()
                                + "现在售出第" + nums + "张票");
                        // 休眠时间
                        try {
                            Thread.sleep(2000);
                            for(Thread t:list){
                                if(t!=this){
                                    t.setPriority((t.getPriority()+1));
                                }
                                else{
                                    this.setPriority(this.getPriority()-list.size()+1);
                                }
                            }
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                        nums--;
                    } else {
                        
                        break;
                    }
                }
            }    }
    }