Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java多线程问题_Java_Multithreading - Fatal编程技术网

Java多线程问题

Java多线程问题,java,multithreading,Java,Multithreading,我有一个包含数据的对象,我正在将一个操作(带有可以执行的方法的接口)与该对象排队(该操作将在其方法中使用对象的数据),排队的操作将从另一个线程执行 我希望在将对象发送到操作队列(因此从我的主线程)后锁定该对象 因为我不希望对象的数据在另一个线程通过操作队列处理之前被更改 我希望在处理操作队列之后,从另一个线程解锁对象 代码说明: // THREAD 1 final Object object = getObjectFromSomeWhere(); // lock the object her

我有一个包含数据的对象,我正在将一个操作(带有可以执行的方法的接口)与该对象排队(该操作将在其方法中使用对象的数据),排队的操作将从另一个线程执行

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

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

我希望在处理操作队列之后,从另一个线程解锁对象

代码说明:

// 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

        }
您可能会说我可以将对象的副本发送到操作,但是我的对象包含非常大的数据,并且复制需要花费很多时间,所以我不能


有没有一种方法可以在不对我的对象硬编码lock()和unlock()方法的情况下执行此操作?

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

如果您想锁定对象数据,使其不被其他线程更改,但让线程的执行保持可用,则需要在
对象
类中执行。我相信这不是一个目标。例如,您可以将引用传递给有权访问对象的
线程
,并在其内部检查
线程。currentThread()==mallowdThread要知道此线程是否允许修改对象


另外,您可以使用一些OO方法来处理这个问题,例如,使您的对象具有包本地setters,并将一个能够访问setters的包装器传递给操作。很难说什么是解决方案,因为我看不出你的实际问题。希望我的一些建议也能对你有所帮助

线程之间的唯一公共引用是对象,因此要实现锁定,必须修改对象。如果不想修改对象,可以编写一个助手类,该类将使用倒计时闩锁来执行任务。并在所有线程之间传递此帮助器类引用。 看看这是不是你要找的-

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

我的问题是,当我将数据(对象)发送到操作队列时,它的格式很好。但是数据会持续更改,并且当数据不再是良好格式时(从线程1修改时),可能会执行该操作,这是危险的。我的线程2是一个渲染器,它的网格需要有序的数据。在“锁定/解锁”对象下是什么意思?当另一个线程试图更改对象时,它应该如何操作?有不止一种可能性,一种是另一个线程在对数据进行任何修改之前可能必须等待解锁。或者我可以硬编码一些东西,当数据被锁定时,每次对数据进行修改都会将其放入队列,并在数据不再被锁定时执行。可能是消费者-生产者模式?这里有一个非常简单(不是最好的)的开始
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();   
    }
}