как дать имя экземплярам Redis

В самом деле, вы не можете ... Единственный способ сделать это - либо использовать thread.stop, либо согласиться на «совместный» метод (например, периодически проверять Thread.isInterrupted или вызывать метод, который генерирует InterruptedException, например Thread.sleep ()) или каким-то образом полностью вызывать метод в другой JVM.

Для определенных видов тестов вызов stop () в порядке, но это, вероятно, повредит состояние вашего тестового набора, поэтому вам придется перезапустить JVM после каждого вызова, чтобы остановить (), если вы чтобы избежать эффектов взаимодействия.

Для хорошего описания того, как реализовать кооперативный подход, ознакомьтесь с частотами Sun по устаревшим методам Thread .

Для пример этого подхода в реальной жизни, Объект Eclipse RCP Job API «IProgressMonitor» позволяет некоторым службам управления сигнализировать подпроцессы (через метод «cancel»), которые они должны останавливать. Конечно, это зависит от методов фактического контроля метода isCancelled, который они часто не выполняют.

Гибридный подход может состоять в том, чтобы спросить поток красиво с прерыванием, а затем настаивать через пару секунд с остановкой. Опять же, вы не должны использовать stop в производственном коде, но в этом случае это может быть хорошо, особенно. если вы выйдете из JVM вскоре после этого.

Чтобы проверить этот подход, я написал простую упряжь, которая выполняет runnable и пытается ее выполнить. Не могу комментировать / редактировать.

public void testStop(Runnable r) {
    Thread t = new Thread(r);
    t.start();
    try {
        t.join(2000);
    } catch (InterruptedException e) {
        throw new RuntimeException(e);
    }

    if (!t.isAlive()) {
        System.err.println("Finished on time.");
        return;
    }

    try {
        t.interrupt();
        t.join(2000);
        if (!t.isAlive()) {
            System.err.println("cooperative stop");
            return;
        }
    } catch (InterruptedException e) {
        throw new RuntimeException(e);
    }
    System.err.println("non-cooperative stop");
    StackTraceElement[] trace = Thread.getAllStackTraces().get(t);
    if (null != trace) {
        Throwable temp = new Throwable();
        temp.setStackTrace(trace);
        temp.printStackTrace();
    }
    t.stop();
    System.err.println("stopped non-cooperative thread");
}

Чтобы проверить это, я написал два конкурирующих бесконечных цикла, один кооператив и один, который никогда не проверяет прерывистый бит потока.

public void cooperative() {
    try {
        for (;;) {
            Thread.sleep(500);
        }
    } catch (InterruptedException e) {
        System.err.println("cooperative() interrupted");
    } finally {
        System.err.println("cooperative() finally");
    }
}

public void noncooperative() {
    try {
        for (;;) {
            Thread.yield();
        }
    } finally {
        System.err.println("noncooperative() finally");
    }
}

Наконец, я написал тесты (JUnit 4), чтобы их реализовать:

@Test
public void testStopCooperative() {
    testStop(new Runnable() {
        @Override
        public void run() {
            cooperative();
        }
    });
}

@Test
public void testStopNoncooperative() {
    testStop(new Runnable() {
        @Override
        public void run() {
            noncooperative();
        }
    });
}

Раньше я никогда не использовал Thread.stop (), поэтому я не знал о его работе. Он работает, бросая объект ThreadDeath из того, что целевой поток в настоящее время запущен. Это расширяет Ошибка. Таким образом, хотя он не всегда работает чисто, он обычно оставляет простые программы с довольно разумным состоянием программы. Например, вызываются все окончательные блоки. Если вы хотели быть настоящим рывком, вы могли бы уловить ThreadDeath (или Error) и продолжать работать в любом случае!

Если ничего другого, это действительно заставляет меня пожелать большего кода подход IProgressMonitor - добавление другого параметра к методам, которые может занять некоторое время, и побудить разработчика метода изредка опросить объект Monitor, чтобы узнать, хочет ли пользователь отказаться от системы. Я попытаюсь следовать этой схеме в будущем, особенно методы, которые могут быть интерактивными. Конечно, вы не обязательно заранее знаете, какие методы будут использоваться таким образом, но это то, на что, по-видимому, являются Profilers.

Что касается метода «начать другой JVM полностью», это будет возьмите больше работы. Я не знаю, написал ли кто-нибудь делегат-загрузчик классов, или если он включен в JVM, но это потребуется для этого подхода.

0
задан Programmer 16 January 2019 в 10:09
поделиться

1 ответ

Различайте пользователей, которые запускают каждый экземпляр Redis.

ps -awef| grep redis
redis     11498     1  0 09:30 ?        00:00:02 /usr/bin/redis-server 127.0.0.1:6379
redis2    13285     1  0 10:00 ?        00:00:00 /usr/bin/redis-server 127.0.0.1:6380
0
ответ дан yeahseol 16 January 2019 в 10:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: