提问者:小点点

Java中的线程和对象[副本]


我正在处理一个赋值,使三个线程访问同一个对象,并打印当前在该对象上工作的线程的名称。 以下是代码

public class thread1{
    public static void main(String args[]){
        test obj=new test();
        new threads(obj);
    }
}
class test{
    public synchronized void message(Thread t){
        System.out.println(t.getName());
    }
}
class threads implements Runnable{
    Thread t1,t2,t3;
    public void run(){
    }
    public threads(test obj){
        t1=new Thread(){
            public void run(){
                obj.message(t1);
            }
        };
        t2 = new Thread() {
            public void run() {
                obj.message(t2);
            }
        };
        t3 = new Thread() {
            public void run() {
                obj.message(t3);
            }
        };
        t1.start();
        t2.start();
        t3.start();
    }
}   

但是从输出来看,第三个线程在第二个线程之前访问对象,我需要的是以同步方式访问对象的线程,也就是说; 应该以线程-0->的方式访问对象; 线程-1->; 螺纹2

为了实现这一点,我应该在代码中做哪些更改?


共1个答案

匿名用户

synchronized根本不控制顺序。 它只是确保没有两个线程可以同时进入它。

如果您想要一个显式的1,2,3顺序,那么为什么要有线程呢? 线程处理用于并行执行代码,而不是顺序执行代码。

无论如何,您可以在t1.start()之后直接执行t1.join();。 在执行t2.start()之前,这将显式地等待到第一个线程完成。 然后也执行t2.join();,原因相同。 所以:

t1.start();
t1.join();
t2.start();
t2.join();
t3.start();

您也可以有一个等待和通知系统。 或者采用更复杂的结构来实现顺序依赖。