解决方案 »

  1.   

    join()不是这么用的.
    我这里有个例子供你参考
    class Sleeper extends Thread{
        private int duration;
        public Sleeper(String name,int sleepTime){
            super(name);
            duration=sleepTime;
            start();
             
        }
         
        public void run(){
            try{
                for(int i=0;i<50;i++){
                    System.out.println(i);
                }
                sleep(duration);
            }catch(InterruptedException e){
                System.out.println(getName() + "was interrupted" + "is Interrupted" + isInterrupted());
                return;
            }
            System.out.println(getName()+ "has awakened");
        }
    }
    class Joiner extends Thread{
        private Sleeper sleeper;
        public Joiner(String name,Sleeper sleeper){
            super(name);
            this.sleeper=sleeper;
            start();
        }
        public void run(){
            try{
                sleeper.join();
            }catch(InterruptedException e){
                e.printStackTrace();
            }
             
            System.out.println(getName()+ "join completed");
        }
    }
    public class Joining {
        public static void main(String[] arg){
            Sleeper s1= new Sleeper("sleepy",2000),
                s2=new Sleeper("grumpy",2000);
            Joiner j1= new Joiner("dopey",s1),
                j2=new Joiner("doc",s2);
        }
    }
      

  2.   

    1.   结束不结束没什么关系啊。 join本来就是等结束啊。  结果不一样是因为线程并发的问题造成的。
       你吧join放在上面的话,等于是没执行一个线程他都要等执行好再下一个,你这个看起来是多线程,其实就是个单线程。
    2.  volatile不能解决这个问题,volatile只保证可见性。  对于i++ ,它不是一个原子操作。 它其实是i = i+1
       你要解决并发问题,一个是可以用锁,保证同时就一个人修改。 或者用atomicInteger类,它用CAS操作保证了操作的原子性。