Java 中的线程和对象

Sla*_*elo 0 java multithreading

我正在处理一项任务,使三个线程访问同一个对象并打印当前处理该对象的线程的名称。下面给出的是代码

public class ThreadOne{
    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();
    }
}   
Run Code Online (Sandbox Code Playgroud)

但是从输出来看,第三个线程在第二个线程之前访问对象,我想要的是线程以同步方式访问对象,即;应该以这种方式访问​​对象 Thread-0 -> Thread-1 -> Thread-2

我应该对代码进行哪些更改来实现这一点?

Zab*_*uza 5

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

如果您想要 1、2、3 的显式顺序,为什么首先要使用线程?线程用于并行而不是顺序执行代码。

无论如何,您可以t1.join();t1.start(). 这将显式等待,直到第一个线程完成,然后再执行t2.start()。然后也是t2.join();出于同样的原因。所以:

t1.start();
t1.join();
t2.start();
t2.join();
t3.start();
Run Code Online (Sandbox Code Playgroud)

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