2013-04-21 3 views
0

Я новичок в многопоточности,Сделайте копию объекта anonymous thread

и сейчас я работаю над передачей параметра в тему.

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 с заданной задачей

в государственной ничтожной перспективе, как это.

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

Я хочу использовать этот работоспособный объект для различных потоков с различным OBJ значения, так что это можно сделать глубокую копию с тем же способом выполнения?

Заранее благодарен!

Редактировать: оригинал MyRunnable(). Run() ничего не делает, и задача выполнена в анонимном блоке, есть ли какая-либо работа, чтобы сделать копию с тем же реализованным методом run()?

ответ

0

Вы можете сделать конструктор копирования

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 
} 
+0

Спасибо за отзывался, но я перезаписать метод выполнения, так будет, что будет скопирован, а? – user2304633

+0

Исходный метод запуска ничего не делает, и я реализую внутри анонимного блока. Я знаю, что всегда могу создать новый класс, который расширяет MyRunnable до исправления, но их много, поэтому создание новых классов будет больно. – user2304633

+0

Я думаю, что вы все это делаете неправильно, сколько реализаций MyRunnable есть и какие общие функции распределяются между ними (настолько, что вам нужно расширить MyRunnable) – NeilA

0

Вы можете создать метод, который возвращает определенный тип MyRunnable:

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

Затем вызовите этот метод каждый раз, когда вам нужно MyRunnable с этим конкретным способом выполнения:

someMethod(getRunnableForSomePurpose()); 
Смежные вопросы