代码如下,运行正常,共3个thread,每个thread操作money3次后才允许下一个thread操作money变量,
但是奇怪的是,如果把Setmoney()中被注释掉的那几行代码加上[也就是加了个sleep()功能],结果就有问题了,是3个thread交替去操作money变量,没有达到线程同步的效果!咋回事儿ni???//
// DEMO: 
//
public class ThreadSync implements Runnable
{
         String ThreadName = "abc";
int SleepTime;
int UseMoney;
static int Money=0;

    public ThreadSync(String str, int v_time, int v_money)
    {
        ThreadName = str;
        SleepTime = v_time;
        UseMoney = v_money;
        System.out.println(ThreadName + " Created !");
    }
    
    public void run()
    {
System.out.println("Thread: " + ThreadName + " Begin...");
        SetMoney(UseMoney);
System.out.println("Thread: " + ThreadName + " End...");
    }
    
    public synchronized void SetMoney(int tmp)
    {
//        try
//        {
            for(int c = 1 ;c <= 5 ; c++)
            {
             Money += tmp;
                System.out.println(ThreadName + " -- " + c + "==" + Money);
//                Thread.sleep(SleepTime);
            }
//        }
//        catch(InterruptedException e)
//        {
//            //return;
//        }
    }
    
    public static void main(String argv[])
    {
     ThreadSync tmp;
     Thread T;
     tmp = new ThreadSync("001", 400, 2); //thread名称,sleep时间,每次操作金额
     T = new Thread(tmp);
T.setPriority(4);
     T.start();
     tmp = new ThreadSync("002", 600, 4);
     T = new Thread(tmp);
T.setPriority(6);
     T.start();
     tmp = new ThreadSync("003", 800, -3);
     T = new Thread(tmp);
T.setPriority(8);
     T.start();
    
     for(int i = 1; i <= 10; i++)
     {
     try
     {
     if( Thread.activeCount()<=1)
     break;
               //System.out.println("Active Threads: " + Thread.activeCount());
              Thread.sleep(500);
                   }
                   catch(InterruptedException e)
                   {
                  System.out.println("Error Happened !");
                    }
         }
        System.out.println("ThreadMain End !");     //another begin thread method
     //new Thread(new Thread02("001", 400)).start();
     //new Thread(new Thread02("002", 600)).start();
     //new Thread(new Thread02("003", 800)).start();
    }
}

解决方案 »

  1.   

    public void run()
        {
    System.out.println("Thread: " + ThreadName + " Begin...");
            SetMoney(UseMoney);
    System.out.println("Thread: " + ThreadName + " End...");
        }
        
    SetMoney(UseMoney);原语
    System.out.println("Thread: " + ThreadName + " End...");
    System.out.println("Thread: " + ThreadName + " Begin...");
    这两个不是啊,
      

  2.   

    刚才说错了,SetMoney(UseMoney);也不是原语
    因为public synchronized void SetMoney中synchronized是对this同步,但你看
    tmp = new ThreadSync("001", 400, 2);
    tmp = new ThreadSync("002", 600, 4);
    tmp = new ThreadSync("003", 800, -3);
    有3个this啊,
    也是初学者,等高手
      

  3.   

    //
    // DEMO: 
    //
    public class ThreadSync implements Runnable
    {
             String ThreadName = "abc";
    int SleepTime;
    int UseMoney;
    static int Money=0;
    static String qq="a";
        public ThreadSync(String str, int v_time, int v_money)
        {
            ThreadName = str;
            SleepTime = v_time;
            UseMoney = v_money;
            System.out.println(ThreadName + " Created !");
        }
        
        public void run()
        {
    synchronized(qq){
             System.out.println("Thread: " + ThreadName + " Begin...");
            SetMoney(UseMoney);
    System.out.println("Thread: " + ThreadName + " End...");
            }
        }
        
        public void SetMoney(int tmp)
        {
            try
            {
                for(int c = 1 ;c <= 5 ; c++)
                {
                 Money += tmp;
                    System.out.println(ThreadName + " -- " + c + "==" + Money);
                   Thread.sleep(SleepTime);
                }
            }
            catch(InterruptedException e)
            {
            }
        }
        
        public static void main(String argv[])
        {
         ThreadSync tmp;
         Thread T;
         tmp = new ThreadSync("001", 400, 2); //thread名称,sleep时        间,每次操作金额
         T = new Thread(tmp);
         T.start();
         tmp = new ThreadSync("002", 600, 4);
         T = new Thread(tmp);
         T.start();
         tmp = new ThreadSync("003", 800, -3);
         T = new Thread(tmp);
         T.start();
        
        }
    }
      

  4.   

    --好象确实是因为this的问题!但还是没想明白为什么会跟sleep()有关系?难道的测试代码的逻辑有问题??