Java多线程问题

时间:2016-12-30 11:56:03

标签: java multithreading

我有一个包含数据的对象,我正在使用此对象对Action(具有可执行的方法的接口)进行排队(该操作将在其方法中使用对象的数据),并且将排队的Actions将被执行来自另一个主题。

我希望在将对象发送到操作队列后将其锁定(因此从我的主线程开始)。

因为我不希望在另一个线程通过操作队列处理对象之前更改对象的数据。

我希望一旦处理完行动队列,就可以从其他线程中解锁对象。

代码插图:

// THREAD 1
final Object object = getObjectFromSomeWhere(); 

// lock the object here

concurrentActionQueue.add(new Action() {
        @Override
        public void execute() {
          // will be executed from THREAD 2
          // do something with object

          //unlock here once the data is processed

        }

你会说我可以将该对象的副本发送给Action,但是我的对象包含非常大的数据并且复制花费了很多时间,所以我不能。

如果没有将lock()和unlock()方法硬编码到我的对象,有没有办法做到这一点?

2 个答案:

答案 0 :(得分:0)

如果要锁定所有主线程的执行,可以使用CountDownLatch

th

如果要锁定对象数据,使其不被其他线程更改,但保留线程执行可用,则需要在// THREAD 1 final Object object = getObjectFromSomeWhere(); final CountDownLatch latch = new CountDownLatch(1); concurrentActionQueue.add(new Action() { @Override public void execute() { // will be executed from THREAD 2 // do something with object latch.countDown(); } } latch.await(); 类中进行。我相信它不是一个对象。例如,您可以将引用传递给可以访问该对象的Object,并在其中检查Thread以了解是否允许此线程修改对象。

此外,您可以使用一些OO方式来处理它,例如,使对象具有包本地setter并将有权访问setper的包装器传递给该操作。很难说什么是解决方案,因为我没有看到你的实际问题。希望我的一些建议也可以帮到你。

答案 1 :(得分:0)

只有线程之间的共同参考是您的对象因此实现锁定您必须修改您的对象。如果您不想修改对象,可以编写一个帮助程序类,它将使用倒计时锁存器来执行任务。并在所有线程中传递此辅助类引用。 看看这是不是你想要的 -

final YourObject object = getObjectFromSomeWhere();

class HelperObject {
YourObject object;
public HelperObject(YourObject object){
this.object = object;
}
 final CountDownLatch latch = new CountDownLatch(1);
   public void countDown(){
     latch.countDown(); 
   }

   public void await(){
    latch.await();
   }
}

 concurrentActionQueue.add(new Action() {
    @Override
    public void execute() {
      // will be executed from THREAD 2
      HelperObject helperObj;// do something with object

      helperObj.countDown();   
    }
}