将线程和方法与对象同步?

时间:2010-09-21 10:25:48

标签: java multithreading

我有一个方法和一个线程,我想按以下顺序运行:首先,该方法应该对一个对象做一些事情,然后线程应该对该对象做一些事情。他们共享同一个对象。我必须同步它们,但我只是在与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();
}

4 个答案:

答案 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)

我认为更好的方法是调用你想用对象执行某些操作的方法,然后声明一个可以用对象做某事的线程。