本帖最后由 a3821422 于 2011-12-16 11:43:28 编辑

解决方案 »

  1.   

    import java.util.*; 
    public class Test1 {

    public static void main(String[] args){
    System.out.println("赛跑程序即将开始");
    ThreadDemo t = new ThreadDemo();
    t.getName("白马");
    Thread tt= new Thread(t);
    ThreadDemo t1 = new ThreadDemo();
    t1.getName("黑马");
    Thread tt1= new Thread(t1);
    tt.start();
    tt.yield();
    tt1.start();
    }
    }
    class ThreadDemo extends Thread{
    int Hourse = 0;
    boolean falg = true;
    String Name = null;
    public String getName(String Name){
    this.Name = Name;
    return Name;
    }
    public void run(){
    try{
    while(falg){
    if(Hourse>=10){
    System.out.println("[" + Name + "]" + "win!");
    falg = false;
    System.exit(0);
    }
    Random r = new Random();
    int v = r.nextInt(100);
    Hourse += v;
    System.out.println("[" + Name + "]" +  "它在离起跑线已经========" + Hourse + "米");
    Thread.sleep(1000);
    }
    }catch(InterruptedException e){
    e.printStackTrace();
    }
    }

    }//因为我这维护的机子没有eclipse所以只能手动排版下凑合看看哪吧..
      

  2.   

    System.exit(0)是虚拟机退出,这个方法太霸道!class ThreadDemo extends Thread {
        int Hourse = 0;
        volatile static boolean falg = true;
        String Name = null;
        public String getName(String Name) {
            this.Name = Name;
            return Name;
        }
        public void run() {
            try {
                    while (falg) {
                        Random r = new Random();
                        int v = r.nextInt(10);
                        Hourse += v;
                        Thread.sleep(1000);//这是比较费时的过程
                        if (Hourse >= 20) {//如果超过了20,就赢了
                            Thread.currentThread().interrupt(); 
                        }                  //如果没有超过20,才会打印
                        System.out.println("[" + Name + "]" + "它在离起跑线已经========" + Hourse + "米");
                    }
            } catch (InterruptedException e) {
                if(falg){
                    System.out.println("[" + Name + "]" + "win!");
                    falg = false;
                }
                Thread.currentThread().interrupt();
            }
        }
    }
      

  3.   

    sorry,刚才的代码有问题,又改了一下:class ThreadDemo extends Thread {
        int Hourse = 0;
        volatile static boolean falg = true;
        String Name = null;
        public String getName(String Name) {
            this.Name = Name;
            return Name;
        }
        public void run() {
            try {
                    while (falg) {
                        Random r = new Random();
                        int v = r.nextInt(10);
                        Hourse += v;
                        Thread.sleep(1000);//这是比较费时的过程
                        if (Hourse >= 20) {//如果超过了20,就赢了
                            Thread.currentThread().interrupt(); 
                        }                  //如果没有超过20,才会打印
                        if(falg && !Thread.currentThread().isInterrupted())System.out.println("[" + Name + "]" + "它在离起跑线已经========" + Hourse + "米");
                    }
            } catch (InterruptedException e) {
                synchronized(ThreadDemo.class){//这里必须得做同步,否则,两个线程可能已经同时进入了if
                    if(falg){
                        System.out.println("[" + Name + "]" + "win!");
                        falg = false;
                    }
                    Thread.currentThread().interrupt();
                }
            }
        }
    }
      

  4.   

    //最终版
    class ThreadDemo extends Thread {
        int Hourse = 0;
        volatile static boolean falg = true;
        String Name = null;
        public String getName(String Name) {
            this.Name = Name;
            return Name;
        }
        public void run() {
            try {
                    while (falg) {
                        Random r = new Random();
                        int v = r.nextInt(10);
                        Hourse += v;
                        Thread.sleep(1000);//这是比较费时的过程
                        if (Hourse >= 20) {//如果超过了20,就赢了
                            Thread.currentThread().interrupt(); 
                        }                  //如果没有超过20,并且线程没有被中断,会打印中间输出
                        if(falg && !Thread.currentThread().isInterrupted())
                            System.out.println("[" + Name + "]" + "它在离起跑线已经========" + Hourse + "米");
                    }
            } catch (InterruptedException e) {
                synchronized(ThreadDemo.class){//这里必须得做同步,否则,两个线程可能已经同时进入了if
                    if(falg){
                        //打印最终的输出
                        System.out.println("[" + Name + "]" + "它在离起跑线已经========" + Hourse + "米");
                        System.out.println("[" + Name + "]" + "win!");
                        falg = false;
                    }
                }
            }
        }
    }
      

  5.   


    //反正都得使用同步,也许这样才对
    class ThreadDemo extends Thread {
        int Hourse = 0;
        volatile static boolean falg = true;
        String Name = null;
        public String getName(String Name) {
            this.Name = Name;
            return Name;
        }
        public void run() {
            try {
                    while (falg) {
                        Random r = new Random();
                        int v = r.nextInt(10);
                        Hourse += v;
                        Thread.sleep(1000);//这是比较费时的过程
                        if (Hourse >= 20) {//如果超过了20,就赢了
                            synchronized(ThreadDemo.class){//这里必须得做同步,否则,两个线程可能已经同时进入了if
                                if(falg){
                                    //打印最终的输出
                                    System.out.println("[" + Name + "]" + "它在离起跑线已经========" + Hourse + "米");
                                    System.out.println("[" + Name + "]" + "win!");
                                    falg = false;
                                }
                            }
                        }                  
                        if(falg)//如果没有超过20,打印中间输出
                            System.out.println("[" + Name + "]" + "它在离起跑线已经========" + Hourse + "米");
                    }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }