Java 中的线程和对象



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

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();
}
}   

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

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

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

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

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

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

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

最新更新