【问题标题】:Make a copy object of anonymous thread制作匿名线程的副本对象
【发布时间】:2013-04-21 15:27:59
【问题描述】:

我是多线程新手,

我目前正在将参数传递给线程。

public class MyRunnable<T> implements Runnable{

protected T obj;

public MyRunnable(){
    obj= null;
}
@Override
public void run(){
    //do something
}

public void setObj(T obj){
    this.obj=obj;
}

public T getObj(){
    return obj;
}

}

我正在尝试使用指定任务初始化 MyRunnable obj

在 public void run 中,像这样。

someMethod(new MyRunnable<someType>(){
public void run(){
    // do some jobs 1.
        // do some jobs 2.
}
});

我想将此可运行对象用于具有不同 obj 值的不同线程, 那么是否可以使用相同的运行方法进行深层复制?

提前致谢!

编辑: 原始的 MyRunnable().run() 什么都不做,并且任务是在匿名块中实现的,是否可以使用相同的实现 run() 方法制作副本?

【问题讨论】:

    标签: java multithreading clone


    【解决方案1】:

    你可以创建一个拷贝构造函数

    public MyRunnable(MyRunnable myRunnable) {
        this.fieldA = myRunnable.fieldA;
        this.felddB = myRunnable.fieldB;
        // etc
    }
    

    因为您将使用不同的对象(所有其他字段都相同),所以修改构造函数以反映这一点

    public MyRunnable(T obj, MyRunnable myRunnable) {
        this.obj = obj;
        this.fieldA = myRunnable.fieldA;
        this.felddB = myRUnnable.fieldB;
        // etc
    }
    

    【讨论】:

    • 感谢回复,但是我确实覆盖了 run 方法,所以也会被复制吗?
    • 原来的run方法什么都不做,我在匿名块里面实现。我知道我总是可以创建一个新类 extends MyRunnable 来解决这个问题,但是它们有很多,所以创建新类会很痛苦。
    • 我认为你在这一切都错了,有多少 MyRunnable 的实现以及它们之间共享的通用功能(如此之多以至于你需要扩展 MyRunnable)
    • MyRunnable 的所有实例都将使用相同的运行方法。作为替代方案,您可以在 MyRunnable 中有一个 Runnable runnable 字段,然后您可以将其 runnable 方法实现为 void run() { if (runnable != null) runnable.run(); else // default run method },这将允许您使用匿名 Runnable 覆盖 run 方法
    【解决方案2】:

    您可以创建一个返回特定类型的 MyRunnable 的方法:

    public MyRunnable<SomeType> getRunnableForSomePurpose(){
        return new MyRunnable<SomeType>(){
            public void run(){
                //do some jobs
            }
        }
    }
    

    然后在每次需要带有特定运行方法的 MyRunnable 时调用该方法:

    someMethod(getRunnableForSomePurpose());
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-28
      • 2012-01-02
      • 2011-02-26
      相关资源
      最近更新 更多