Java线程 - 接口问题

时间:2011-05-22 18:21:37

标签: java multithreading

我试图在多线程应用程序上应用状态模式。问题是编译器不喜欢我的类扩展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.Thread.State:Networks2.LockedState。当我从Connectionhandler中删除extends Thread时,它不会给出任何错误,但这不是一个选项。 所以问题是:我该怎么做才能让编译器不抱怨?感谢

3 个答案:

答案 0 :(得分:6)

我认为延长java.lang.Thread是一个非常糟糕的主意。我怀疑你是否会提供值得延期的行为。

我打赌你真的想要实施java.lang.Runnable并让它由java.lang.Thread执行。

答案 1 :(得分:1)

问题是您扩展了Thread并且在构造函数中没有明确的super()调用。由于Thread中不存在no-arg构造函数,因此需要在超级cal中显式调用其中一个公共构造函数。

当您实施Runnable而非扩展Thread时,您不会遇到问题。使用new Thread(runnable),您可以构造一个执行给定的可运行实例的标准线程。

答案 2 :(得分:1)

java.lang.Thread已经包含名为State的内部类。所以你的变量被声明为不同的类型。难怪它失败了。

只需将您的类State重命名为MyState或其他任何名称。

另外,我同意其他建议使用Runnable而不是Thread。但这是为了回答具体问题,为什么它无法编译。顺便说一句,编译器消息已经给出了答案,因为它说它不能分配给java.lang.Thread.State。