Как установить значения для приватной переменной в классе, где конструктор класса сам запускает поток? - PullRequest
0 голосов
/ 09 мая 2019

Ниже приведен мой класс исходного кода, в котором конструктор класса запускает поток. Но в run () он проверяет ненулевое значение переменной. Поэтому для проверки использования junit эта переменная не должна быть нулевой.

public class MainClass extends Thread {
    private SomeQue que;
    private static final String THREAD_NAME = "s_thread";
    private boolean isRunning = false;

    public MainClass () {
        setName(THREAD_NAME);
        setIsRunning(true);
        start();
    }

    public void run() {
        while (isRunning()) {
            if (que!= null) {
                obj = que.pop();
                if (obj != null) {
                    //....
                }
            }
        }
    }
}

Если использовать

ReflectioinTerstUtils.setField(new MainClass(),"que",que);      

, мы должны создать объект, чтобы установить переменные для данных при создании самого объекта. Поток начинает работу. Так что любые идеи ..

1 Ответ

1 голос
/ 09 мая 2019

Единственный способ, который я вижу (кроме рефакторинга), - создать экземпляр объекта без вызова конструктора.Это можно сделать с помощью внутреннего класса sun.misc.Unsafe :

Примечание: само имя этого класса говорит о том, насколько мощным (и смертоносным) он может быть.С большой властью приходит большая ответственность.Используйте с умом.

// Obtain the unsafe object without throwing a SecurityException (assuming no security manager)
Field field = Unsafe.class.getDeclaredField("theUnsafe");
field.setAccessible(true);
Unsafe unsafe = (Unsafe) field.get(null);

// Create the instance 
MainClass instance = (MainClass) unsafe.allocateInstance(MainClass.class); // Constructor is not called

// set isRunning if needed
// do junit stuff
...