本帖最后由 l514941630 于 2010-09-21 10:09:30 编辑

解决方案 »

  1.   

    你把
    System.out.println(Thread.currentThread() + "等待对象b完成计算"); 
    这段写在run方法里面试试就知道了.
      

  2.   

    当一个对象建立的时候! 他就是一个自己的主线程,在这里他是B线程的拥有者,但必不表示,他必须首先执行b,他要等到自己执行完了以后,释放了线程锁,才开始执行B的!!
    不知道自己理解的对不对!! 
      

  3.   

    显示的是Thread[Thread-0,5,main]等待对象b完成计算 是啥意思呢?
      

  4.   

    哦, 我也搞糊涂了. 为了这个查了一番资料. 我也学习了.
    下面是JAVA API中对currentThread方法的描述currentThread
    public static Thread currentThread()返回对当前正在执行的线程对象的引用。 返回:
    当前执行的线程。
    当前执行的线程. 不论你做什么操作, 他只返回当前执行的线程.
      

  5.   

    主线程的synchronized已经把对象锁住,防止有其他线程在主线程使用该对象的时候侵占b。对你的代码我的理解是:主线程已经在使用了b对象,那么如果有一个新的线程如果也想使用b的话就会阻塞:package csdn.javase.thread;public class ThreadA {

        public static void main(String[] args) { 
         //改了下,内部类的参数都要声明为final的
            final ThreadB b = new ThreadB(); 
            b.start(); 
            synchronized (b) { 
                try { 
                    System.out.println(Thread.currentThread() + "等待对象b完成计算"); 
                    /*这里是主线程在执行,它把对象锁住了,与b自身的执行无关,把打印语句放进b里面是打印b线程的了:
                     * Thread[Thread-0,5,main]等待对象b完成计算
                     * */
                    Thread.sleep(1000);
                    b.wait(); 
                } catch (InterruptedException e) { 
                    e.printStackTrace(); 
                } 
                System.out.println("b对象计算的总和是:" + b.total); 
            } 
        
            //启动新的进程去锁住b试试
            new Thread(){
             public void run(){
    /*
     *          把注释去掉的话就是同步访问对象b,会被阻塞         
    */
    /*          synchronized (b){
             try{
             b.run();
             b.wait();
             }catch(InterruptedException e){
             e.printStackTrace();
             }
             }*/
            
             /*尝试以非同步的方式调用对象b的方法时会报错,提示你当前对象不是b资源的拥有者:
              * *
              * Exception in thread "Thread-1" java.lang.IllegalMonitorStateException: current thread not owner
              */
             try{
         b.run();
                 b.wait();
         }catch(InterruptedException e){
         e.printStackTrace();
         }
             }
            }.start();
        } 
    }应该是这样的。呵呵,菜鸟拙见,期待高手们的答案。
      

  6.   

    1. 你这句 System.out.println(Thread.currentThread() + "等待对象b完成计算");   确实是在主线程执行的, 所以Thread.currentThread() 是main完全没有问题。
       也许你说main启动了新线程啊,可这并不影响主线程的执行。你把启动线程当成一句普通的代码好了.2. 楼主可以在 ThreadB的run方法加一句:System.out.println(Thread.currentThread() + "b完成计算");你会发现这个 Thread.currentThread()就不是main,它是Thread-1  (这个线程默认的名字)
      

  7.   

    synchronized(b)与当前运行线程没有任何关系,这个调用不会使得当前线程变换。
    它的意思只是取得对象b的锁,b是否线程对象没有任何关系。
    在Java中,任何一个对象都有一个锁,都可以通过synchronized关键字取得这个对象的锁
      

  8.   

    凭感觉,应该把主线程先sleep下