java - 如何在 Java 的可运行类中保持对象参数不变?

标签 java multithreading runnable

我有一个 Runnable 类:

Class R1 implements Runnable {
  private static final Log LOGGER = LogFactory.getLog(R1.class);
  private final ObjectClass obj;
  private final SomeService service;

  public R1(ObjectClass obj, SomeService service) {
     this.obj = obj;
     this.service = service;
  }

  @override
  public void run() {
    String value = this.obj.getSomeValue();
    LOGGER.debug("Value is " + value);
    // some actions, such as:
    // service.someMethod(obj);
  }
}

我使用 ExecutorService 对象来执行 R1 并将 R1 放入队列中。 但后来在 R1 之外,我更改了我在 R1 中传递的 ObjectClass 中的值,因此 getSomeValue() 之后 R1 中的操作并不像我预期的那样运行。如果我想保持 R1 中 ObjectClass 对象的值不变,我该怎么办?假设对象很大并且有很多get和set方法。

为了使问题更清楚,我需要将 obj 传递给服务类对象,该对象也用作可运行类中的参数。我相应地更改了原始代码。

最佳答案

根据评论,显然我建议的解决方案有问题。

因此,请遵循有关创建新实例和复制所需属性的其他建议。或者创建一个轻量级数据对象来保存您需要的属性。无论哪种方式,我相信你需要 2 个实例来做你想做的事。


我建议您可以实现创建新实例的克隆方法。

http://download.oracle.com/javase/1,5,0/docs/api/java/lang/Cloneable.html

这里的问题是您已将实例传递到 R1 类中,但它仍然是同一个实例,因此对它的更改会影响其他所有内容。因此,实现克隆方法将使您能够轻松创建可在 R1 类中使用的实例副本,同时允许您对原始实例进行进一步更改。

在你的 R1 类中,

public R1(ObjectClass obj) {
   //this.obj = obj;
   this.obj = obj.clone();
}

附言你必须自己实现这个方法。它不会自动为您提供深拷贝。

关于java - 如何在 Java 的可运行类中保持对象参数不变?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7479612/

相关文章:

Java OOP 改变二维矩阵的位置?

Java创建嵌套数组,一个数组包含一个包含键值对的数组的数组

c# - 仅使用一小部分 CPU 在多个任务中运行 CPU 密集型方法?

java-如何确定不同类型服务器中特定类型处理的最佳线程数

android - Activity 类型中的方法 runOnUiThread(Runnable) 不适用于参数 (void)

java - 我们如何使用 FirefoxProfile 保留浏览器的旧 session ?

java - IBM MQ Java 类中的 channel 压缩

multithreading - 究竟是什么让 Erlang 进程、绿色线程、协程 "lighter"比内核线程?上下文切换很重怎么办?

java - 如何使用 ScheduledExecutorService 更改重复任务的速率或周期?

java - 我的僵尸不会找到自己。