Как вы называете поток SwingWorker? Открыт для кода или лучших практик - PullRequest
3 голосов
/ 21 декабря 2009

Я пытаюсь отладить ужасное исключение, которое происходит в потоке SwingWorker. Если бы я мог назвать свои потоки SwingWorker, то я мог бы лучше интерпретировать следы стека, которые я получаю.

Кажется невозможным назвать поток SwingWorker (не так ли?). Я ищу какие-либо передовые практики или «хитрости», чтобы помочь мне правильно идентифицировать мои рабочие потоки, если не считать того, что я пишу код с инструкциями в журнале.

Ответы [ 4 ]

9 голосов
/ 21 декабря 2009

Хотя у вас нет доступа к ThreadFactory, который использует SwingWorker, вы можете вызывать Thread.currentThread (). SetName () в вашем методе run () или call () любого класса, который работает SwingWorker. *

Просто убедитесь, что вы устанавливаете это значение, когда поток фактически выполняет код

1 голос
/ 21 декабря 2009

Поток, используемый SwingWorker, взят из Executors.defaultThreadFactory, что означает, что он из пула. Таким образом, наименование потока может вводить в заблуждение, если «MyXYZThread» повторно используется для другого SwingWorker в системе, которая не может переименовать поток.

Я бы расширил SwingWorker, включив в него имя и журнал, который выдается при создании исключения.

Примечание: я бы предпочел не привлекать вызывающего к ответственности за обработку исключения, но я не вижу способа сделать это без изменения контракта SwingWorker.

private static abstract class MySwingWorker<X, Y> extends SwingWorker<X, Y>
{
    private final String taskName;
    public MySwingWorker(String name)
    {
        this.taskName = name;
    }
    public String getTaskName() {
        return taskName;
    }
}

Использование:

new MySwingWorker<Object,Object>("my task") {
    protected Object doInBackground() {
        try {
            return someCall();
        }
        catch(Exception e) {
            Logger.getLogger(getClass().getName()).log(Level.SEVERE, 
                "Exception in " + getTaskName(), e);
            throw e;
        }
    }
}.execute();
0 голосов
/ 16 октября 2013

Лучше всего использовать уже упомянутый Thread.currentThread (). SetName (String).

«Уловка» - установка ThreadFactory для SwingWorkers:

sun.awt.AppContext context = sun.awt.AppContext.getAppContext();

int maxWorkers = 10;
ThreadFactory factory = ...
ExecutorService executor = Executors.newFixedThreadPool(maxWorkers, factory);

context.put(SwingWorker.class, executor);

Здесь используется класс из пакета sun.awt, поэтому вы были предупреждены.

0 голосов
/ 21 декабря 2009

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

Я бы не предпочел этот метод, но он может быть таким же "хакерским", как и любой другой способ ...

...