2013-06-06 2 views
0

Я технический писатель, который знает некоторые Java, и мне поручено отслеживать потоки в каком-то старом, очень многопоточном Java-коде. Оригинального автора кода больше нет, поэтому мы пытаемся выяснить, как это работает. Я столкнулся с классом, который расширяет Thread, но не реализует метод run(). Какая была бы точка расширения Thread, но не реализована run() (если есть)?Java: продолжение Thread без реализации run()

я заметил, что один из методов этого класса synchronized:

public synchronized void incrementCounter() { 
    this.counter++; 
} 

, но все другие методы, как представляется, не синхронизированы. Фактически, большинство других методов - это просто геттеры и сеттеры. Разбивается Thread или реализует Runnable Необходимо для того, чтобы объявить способ synchronized? Благодаря!

+1

Реферат класса? Возможно, он служит базовым классом для других классов и реализует общую логику, которая может быть разделена между различными подклассами. –

+0

J-D избили меня ... Это может иметь смысл, если это базовый класс для последующих подклассов, которые реализуют run(). – user949300

+0

Класс не абстрактный. Подпись является «public class XXX extends Thread», и она создается из другого класса. – user1002119

ответ

0

Если вы посмотрите на класс, расширяющий Thread (хотя и не рекомендуется) и не реализует метод run, звучит как класс abstract. Проверьте это.

Кроме того, ответ на ваш второй вопрос, безусловно Нет:

synchronised никогда не ожидает, что класс обертывания расширить Thread или реализовать Runnable поскольку поток не связан с конкретным классом, но охватывает один или несколько из них ,

Если вы утверждаете, что заинтересованный класс не abstract, я подозреваю, что Thread типа вы видите, действительно пользовательский типа, принадлежащий другой пакет (иной, чем java.lang.Thread) ... и не имеет ничего общего с классом Thread: уродливый, но возможный ...

3

Мой Угадай, что этот старый код был написан перед некоторыми стандартными библиотеками пула потоков, ExecutorService и т. д. Поэтому, возможно, это была попытка компании реализовать аналогичные функции. (Или же не изобретено здесь ответ) До тех пор, как код всегда делает

Thread thread = new ThisSpecialThreadClass(someRunnable); 
thread.start(); 

вы получите то, что «выгоды» она имеет, и, как вы обратите внимание на Ваш комментарий, он должен в конечном счете назвать someRunnable.run().

+2

+1 это предполагает, что в классе потоков есть конструктор, который вызывает super (Runnable). – Gray

+0

Странно то, что этот класс не создается таким образом, как приведенный выше пример, и start() никогда не вызывается на нем. Он просто создается таким образом, как 'specialClass = new SpecialThreadClass (arg1, arg2);'. Я думаю, что 'extends Thread' - это некоторая ошибка копирования/вставки. – user1002119

+0

Итак, существует ряд конструкторов. Существует '(Runnable, String)' one. Я ставлю, что 'arg1' является' Runnable', а конструктор 'super (arg1, arg2);' так что вы устанавливаете свой runnable @ user1002119. – Gray

1

что бы точка расширения темы, но не осуществляет запуск()

Как @ Mik378 упоминает, там практически нет смысла делать это. Без переопределения метода run() поток начнет и завершится немедленно.

Развертывание Thread или внедрение Runnable необходимо для того, чтобы объявить метод синхронизированным?

Нет, они не имеют никакого отношения друг к другу. Вам не нужно создавать нити для использования методов synchronized. Объектом, который является synchronized, является экземпляр метода, и какой бы ни поток не вызывал его (даже если он является «основным» потоком) будет синхронизироваться с этим объектом.

Смежные вопросы