天天看點

Java 多線程 之 wait等待 線程執行個體

http://www.verejava.com/?id=16992949250274
package com.wait.notify;

/**
 題目: 人們在火車站的售票視窗排隊買火車票
    1. 北京西站開門
    2. 打開售票視窗
    3. 北京西站有10張去長沙的票
    4. 打開2個售票視窗, 
    5 假設每個售票視窗每隔1秒鐘買完一張票
    
    1. 根據 名詞  找類
    人們(Person), 火車站(Station),火車票(Ticket) , 售票視窗e 是火車站的線程
    
    
 */
import java.util.*;

public class TestTrain {
    
    public static void main(String[] args) {
        //火車西站開門
        Station station = new Station("火車西站");

        //開視窗
        Thread win1 = station.openWindow("普通視窗");
        Thread win2 = station.openWindow("學生視窗");

        //視窗1 開始售票
        //設定線程優先級 setPriority()
        //win2.setPriority(Thread.MAX_PRIORITY);

        win1.start();
        win2.start();
    }
}

class Station implements Runnable {
    private String name;//火車站的名稱
    private String[] persons = { "趙海洋", "王銳", "宋沙", "李欣偉", "徐文曉", "孟令強", "王大衛", "李寶琴", "王浩" };// 火車站排隊 買票的人
    private int i = -1;

    public Station(String name) {
        super();
        this.name = name;

    }

    //打開售票視窗  學生視窗,普通視窗,軍人視窗  
    //售票視窗 是線程 Thread
    public Thread openWindow(String name) {
        return new Thread(this, name);
    }

    //火車站售票
    public synchronized void sale() {
        try {
            while (i < persons.length - 1) {
                i++;
                String person = persons[i];
                if ("宋沙".equals(person)) {
                    this.wait();
                }
                if ("徐文曉".equals(person)) {
                    this.notify();
                }

                System.out.println(person + " " + Thread.currentThread().getName() + "  買了一張北京到上海的火車票");

                Thread.sleep(2000);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    @Override
    public void run() {
        //開始售票
        sale();

    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}