Получить текущую трассировку стека в Java

Google для «enumerable.range step», и вы должны столкнуться с альтернативными реализациями Enumerable.Range, которые предоставляют ступенчатые диапазоны. Тогда вы можете просто сделать

Parallel.ForEach(BetterEnumerable.SteppedRange(fromInclusive, toExclusive, step), ...)

Если google не работает, реализация должна быть примерно такой:

public static class BetterEnumerable {
    public static IEnumerable<int> SteppedRange(int fromInclusive, int toExclusive, int step) {
        for (var i = fromInclusive; i < toExclusive; i += step) {
            yield return i;
        }
    }
}

Альтернативно, если «yield return» дает один heebie jeebies, вы всегда можете просто создать обычный старый список на месте:

var list = new List<int>();
for (int i = fromInclusive; i < toExclusive; i += step) {
    list.Add(i);
}
Parallel.ForEach(list, ...);

Это должно быть легко переводимым в VB, если это требование.

936
задан Blorgbeard 12 May 2016 в 02:16
поделиться

6 ответов

Вы можете использовать Thread.currentThread (). GetStackTrace () .

Это возвращает массив из StackTraceElement , который представляет текущий стек след программы.

1133
ответ дан 19 December 2019 в 20:20
поделиться

Глупец, это Thread.currentThread (). GetStackTrace ();

17
ответ дан 19 December 2019 в 20:20
поделиться
try {
}
catch(Exception e) {
    StackTraceElement[] traceElements = e.getStackTrace();
    //...
}

или

Thread.currentThread().getStackTrace()
8
ответ дан 19 December 2019 в 20:20
поделиться

Чтобы получить трассировку стека всех потоков, вы можете использовать утилиту jstack, JConsole или отправить сигнал kill -quit (на операционная система Posix).

Однако, если вы хотите сделать это программно, вы можете попробовать использовать ThreadMXBean:

ThreadMXBean bean = ManagementFactory.getThreadMXBean();
ThreadInfo[] infos = bean.dumpAllThreads(true, true);

for (ThreadInfo info : infos) {
  StackTraceElement[] elems = info.getStackTrace();
  // Print out elements, etc.
}

Как уже упоминалось, если вам нужна только трассировка стека текущего потока, это намного проще - просто используйте Thread.currentThread (). GetStackTrace () ;

21
ответ дан 19 December 2019 в 20:20
поделиться
Thread.currentThread().getStackTrace();

доступен начиная с JDK1.5.

Для более старой версии вы можете перенаправить exception.printStackTrace () на StringWriter () :

StringWriter sw = new StringWriter();
new Throwable("").printStackTrace(new PrintWriter(sw));
String stackTrace = sw.toString();
61
ответ дан 19 December 2019 в 20:20
поделиться
Thread.currentThread().getStackTrace();

нормально, если вам все равно, какой является первый элемент стека.

new Throwable().getStackTrace();

будет иметь определенную позицию для вашего текущего метода, если это имеет значение.

259
ответ дан 19 December 2019 в 20:20
поделиться
Другие вопросы по тегам:

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