Закрытый шлюз API AWS через конечную точку VPC

Кажется, все здесь думают, что внедрение Runnable - это путь, и я действительно не согласен с ними, но есть также аргументы в пользу расширения Thread, на мой взгляд, на самом деле вы его продемонстрировали в своем коде.

Если вы реализуете Runnable, то класс, который реализует Runnable, не имеет контроля над именем потока, это вызывающий код, который может установить имя потока, например:

new Thread(myRunnable,"WhateverNameiFeelLike");

но если вы расширяете Thread, тогда вы сможете управлять этим в самом классе (как в вашем примере вы называете поток ThreadB). В этом случае вы:

A) могли бы дать ему более полезное имя для целей отладки

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

Возможно, вы даже можете возьмите трассировку стека своего создания и используйте это как имя потока. Это может показаться странным, но в зависимости от того, как структурирован ваш код, он может быть очень полезен для целей отладки.

Это может показаться небольшим, но там, где у вас очень сложное приложение с большим количеством потоков и всего внезапные вещи «остановились» (либо по причинам тупика, либо, возможно, из-за недостатка в сетевом протоколе, который был бы менее очевидным, или других бесконечных причин), а затем получить дамп стека из Java, где все потоки называются «Thread» -1 ',' Thread-2 ',' Thread-3 'не всегда очень полезен (это зависит от того, как структурированы ваши потоки и можно ли с пользой сказать, что именно по их трассировке стека - не всегда возможно, если вы используя группы из нескольких потоков, все из которых работают с одним и тем же кодом).

Сказав, что вы, конечно же, можете сделать это выше, путем создания расширения класса потока, который устанавливает его имя в трассировку стека его создания, а затем использовать его с вашими реализациями Runnable вместо стандартный класс java Thread (см. ниже), но в дополнение к трассировке стека может быть больше контекстной информации, которая была бы полезной в имени потока для отладки (ссылка на одну из многих очередей или сокетов, которые она могла бы обрабатывать, например, в этом случае вы можете предпочесть расширить Thread специально для этого случая, чтобы вы могли заставить компилятор заставить вас (или других пользователей, использующих ваши библиотеки) передавать определенную информацию (например, указанная очередь / сокет) для использования в имени).

Вот пример общего потока с трассировкой стека вызовов как его имя:

public class DebuggableThread extends Thread {
    private static String getStackTrace(String name) {
        Throwable t= new Throwable("DebuggableThread-"+name);
        ByteArrayOutputStream os = new ByteArrayOutputStream();
        PrintStream ps = new PrintStream(os);
        t.printStackTrace(ps);
        return os.toString();
    }

    public DebuggableThread(String name) {
        super(getStackTrace(name));
    }

    public static void main(String[] args) throws Exception {
        System.out.println(new Thread());
        System.out.println(new DebuggableThread("MainTest"));
    }
}

и вот образец выходного файла, сравнивающий два имени:

Thread[Thread-1,5,main]
Thread[java.lang.Throwable: DebuggableThread-MainTest
    at DebuggableThread.getStackTrace(DebuggableThread.java:6)
    at DebuggableThread.<init>(DebuggableThread.java:14)
    at DebuggableThread.main(DebuggableThread.java:19)
,5,main]
1
задан drgn 28 March 2019 в 19:58
поделиться