public class BB extends Thread {
int time;
public BB (int t) {
this.time = t;
}

public synchronized void run() {
for(int i = 1; i <= 5; i++) {
System.out.println(Thread.currentThread().getName() + " " + i + "次");
try {
Thread.sleep(time);
} catch (InterruptedException e) {
e.printStackTrace();
}
if(i ==5) {
System.out.println(Thread.currentThread().getName() + "退出了");
}
}
}

public static void main(String[] args) {
BB b1 = new BB(500);
b1.setName("线程1");
b1.start();

BB b2 = new BB(200);
b2.setName("线程2");
b2.start();

BB b3 = new BB(300);
b3.setName("线程3");
b3.start();
}
}run()方法中有synchronized修饰符,为什么还是不能实现同步,输出结果仍然是无序的啊???

解决方案 »

  1.   

    public class BB extends Thread {
       static Object obj = new Object();
       int time;
       ....
       public void run() {
           synchronized(obj){
              //...  你的代码
           }
       }}你这样试试
       
      

  2.   

    synchronized  修饰的方法或对象 。 必须是得所有线程都能访问到的公有方法或对象。
      

  3.   

    new 了三个线程,但用的不是同一个run方法,所以不可能达到楼主想到效果。
    lz不妨试试让BB实现Runnable接口main方法中
    BB bb = new BB();
    Thread b1 = new Thread(BB);
    b1.setName(...);
    start();
    Thread b2 = new Thread(BB);
    b2.setName(...);
    b2.start();
    ...
      

  4.   

    public synchronized void run();
    这个方法,其实是针对当前对象加锁,所以,你new三个对象的话,有三个不同的锁,他们互不相干,当然就不能实现同步了。
    这种写法,想表达的意思是,对于单一的一个BB对象,如果有多个线程调用其run方法,可以达到同步效果。
      

  5.   


    run方法能叫共有的方法吗
    每个线程开启都会有自己的run方法
    开启一个线程就会有自己的一个run();
    楼主相当于有四条线程 一个主线程
    三个分支线程 而这三个线程都有自己的run()方法 分开进行 互不影响!!!
    |   |        |         |
    |   |        |         |
    |   |        |         |
    主   线1(run) 线2(run)线3(run)
      

  6.   

    这个办法好,自己盯住synchronized 的对象。在楼主的程序中,默认的是this.楼主在run()方法里加一句:System.out.println("This object is  "+this);
    用你自己的程序和5楼的程序运行下,看看输出。
      

  7.   

     不用extends Thread,实现多线程要用Runnable接口,一个Runnabale对象可以创建多个线程,所创建的线程共享这个Runnable对象,这样就可以实现同步的效果了。
      

  8.   

    public class BB extends Thread {
        int time;
        public BB (int t) {
            this.time = t;
        }
        
        public void run() {
            synchronized (BB.class)
            for(int i = 1; i <= 5; i++) {
                System.out.println(Thread.currentThread().getName() + " " + i + "次");
                try {
                    Thread.sleep(time);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                if(i ==5) {
                    System.out.println(Thread.currentThread().getName() + "退出了");
                }
            }
    }
        }
        
        public static void main(String[] args) {
            BB b1 = new BB(500);
            b1.setName("线程1");
            b1.start();
            
            BB b2 = new BB(200);
            b2.setName("线程2");
            b2.start();
            
            BB b3 = new BB(300);
            b3.setName("线程3");
            b3.start();
        }
    }关键是锁用的不对,改为如上的用法就可以了。
    有什么问题可以再问我
      

  9.   

    synchronized可以修饰共有方法,但是如果你放到非静态方法定义里面,表示使用当前对象作为锁,你程序每次都创建新的对象,锁的意义就没有了,用一个静态变量或者唯一的一个对象来作为锁即可synchronized (正在的全局唯一对象){
      

  10.   


    package bb;public class BB implements Runnable {    int time;    public BB(int t) {
            time = t;
        }    @Override
        public synchronized void run() {
            for (int i = 1; i <= 5; i++) {
                System.out.println(Thread.currentThread().getName() + " " + i + "次");
                try {
                    Thread.sleep(time);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                if (i == 5) {
                    System.out.println(Thread.currentThread().getName() + "退出了");
                }
            }
        }    public static void main(String[] args) {
            BB b = new BB(500);
            new Thread(b).start();
            new Thread(b).start();
            new Thread(b).start();
        }
    }多线程共享需要使用Runnable哦~不过这样就不能分别设置sleep时间了.
      

  11.   

    非要设置sleep时间话要做到run()下面的循环里哦:
        @Override
        public synchronized void run() {
            for (int i = 1; i <= 5; i++) {
                System.out.println(Thread.currentThread().getName() + " " + i + "次");
                try {
                    Thread.sleep(time);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                if (i == 5) {
                    System.out.println(Thread.currentThread().getName() + "退出了");
                    time -= 200;
                }
            }
        }