#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.