我有一个方法和一个线程,我想按以下顺序运行:首先,该方法应该对一个对象做一些事情,然后线程应该对该对象做一些事情。他们共享同一个对象。我必须同步它们,但我只是在与Threads会面。我怎么能这样做?
private synchronized method()
{
//do something with an object (a field)
}
Runnable ObjectUpdater = new Runnable()
{
//do something with the object after the method has finished
}
我的代码,以某种方式设法冻结我的主线程(方法所在的位置) 我的线程代码:
private Runnable something = new Runnable(){
synchronized (this){
while (flag == false)
{ try {wait();)
catch (IntExc ie) {e.printStackTrace...}
}
//here it does its thing
}
setFlag(false);
}
My method code (part of the main thread)
private void Method()
{
//do its thing
setFlag(true);
notifyAll();
}
答案 0 :(得分:1)
除了在对象上进行同步之外,您可以将该方法作为新线程中的第一个语句调用,或者您可以在方法结束时启动新线程。
很难说你的案例中最好的方法是什么,也许你可以给我们一些关于如何和什么的更多细节?
<强>更新强>
在回答您的代码时(出于某种原因,我无法添加其他评论......)
是从synchronized(this)
块调用的方法吗?如果不是,notifyAll()
应该在同步块中。此外,您是否可以更新代码以显示主线程与方法和对象的交互位置/方式?
答案 1 :(得分:1)
对我来说这是一个简单的问题
“你说我不知道是哪一个 首先访问对象 - 单独的ObjectUpdater线程,或者 主线程(用方法)。如果 单独的线程在之前访问它 主线程,这是坏的,我没有 希望这发生“
如果你想让主线程方法首先调用objectUpdater线程,有一个标志来知道该方法是否首先由主线程访问,如果是更新器,则调用wait到该线程,一旦main完成它调用notify这将运行分隔线程, 要知道哪个线程是主线程或更新程序线程,请在创建线程时为该线程设置名称。并将名称作为Thread.currentThread()。getName()。
答案 2 :(得分:1)
使用Semaphore类允许访问该对象。
public class Main
{
public static void main (String[] args) {
final Obj obj = new Obj();
final Semaphore semaphore = new Semaphore(0);
Thread t = new Thread(new Runnable() {
@Override
public void run() {
try {
semaphore.acquire();
} catch (InterruptedException ex) {
Thread.currentThread().interrupt();
return;
}
obj.doSomething();
}
});
t.setName("test");
t.start();
try {
Thread.sleep(1000);
} catch (InterruptedException ignored) {
}
obj.doSomething();
semaphore.release();
}
}
class Obj {
public void doSomething() {
System.out.println("something done by " + Thread.currentThread());
}
}
答案 3 :(得分:0)
我认为更好的方法是调用你想用对象执行某些操作的方法,然后声明一个可以用对象做某事的线程。