Проблема с интерфейсом потока Java

#java #multithreading

#java #многопоточность

Вопрос:

Я пытаюсь применить шаблон состояния к многопоточному приложению.Проблема в том, что компилятору не нравится тот факт, что мой класс расширяет Thread. Вот код :

 public class ConnectionHandler  extends Thread 
     private State lockedState;
     public ConnectionHandler(Socket socket){
     ...
     lockedState = new LockedState(this);
     }
     public State getState(){}
    public void setState(State state){}

{

public interface State  {
    public void PASSWD(String pass);
    public void ACCESS(String file);
    public void getDIR();
    public void QUIT();
}

public class LockedState implements State  {
    ConnectionHandler connectionHandler;
    public LockedState(ConnectionHandler handler){

        connectionHandler=handler;
    }
    public void PASSWD(String pass){
    public void ACCESS(String file){}
    public void getDIR(){}
    public void QUIT(){}
}
  

Ошибка, которую я получаю, связана с конструктором ConnectionHandler: требуются несовместимые типы java.lang.Нитки.Найдено состояние: Networks2.Заблокированное состояние. Когда я удаляю extends Thread из Connectionhandler, он не выдает никаких ошибок, но это не вариант.
Итак, вопрос: что я должен сделать, чтобы компилятор не жаловался? Спасибо

Комментарии:

1. можете ли вы опубликовать ошибку компиляции?

2. для несовместимых типов требуется java.lang. Нитки. Найдено состояние: Networks2. Заблокированное состояние.

Ответ №1:

Я думаю, что расширение java.lang.Thread — очень плохая идея. Я сомневаюсь, что вы собираетесь обеспечить поведение, которое стоит расширения.

Держу пари, что вы действительно хотите реализовать java.lang.Runnable и выполнить это с помощью java.lang.Thread .

Ответ №2:

проблема в том, что вы расширяете поток и не имеете явного super() вызова в вашем конструкторе. поскольку в Thread не существует конструктора без аргументов, вам потребуется явно вызвать один из общедоступных конструкторов в super cal.

Когда вы бы реализовали Runnable вместо расширения Thread , у вас не было бы этой проблемы. и с помощью new Thread(runnable) вы можете создать стандартный поток, который выполняет данный исполняемый экземпляр.

Комментарии:

1. Хорошо, я внес изменения, чтобы он реализовывал RUnnable и не было проблем с состояниями. Спасибо

Ответ №3:

java.lang.Поток уже содержит внутренний класс с именем State. Итак, ваша переменная объявлена как другой тип. Неудивительно, что это не удается.

Просто переименуйте состояние вашего класса в MyState или любое другое имя.

Кроме того, я согласен с другими рекомендациями использовать Runnable вместо Thread. Но это для ответа на конкретный вопрос, почему не удается скомпилировать. И, кстати, сообщение компилятора уже дает вам ответ, поскольку в нем говорится, что он не может назначить java.lang.Нитки.Состояние.

Комментарии:

1. Спасибо за ответ. Я предполагаю, что это причина, по которой это было исправлено, когда я реализовал Runnable.