2011-05-22 88 views
0

我试图在多线程应用程序上应用状态模式。问题是编译器不喜欢我的类扩展线程的事实。下面是代码:Java线程 - 接口问题

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中移除扩展线程它不给任何错误,但那不是一个选项。 所以问题:我该怎么做,以便编译器不抱怨?谢谢

+0

你能发布编译错误吗? – kuriouscoder 2011-05-22 18:30:56

+0

不兼容类型 必需java.lang.Thread.State 找到:Networks2.LockedState。 – Giannis 2011-05-22 18:36:51

回答

6

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

我敢打赌,你真的想实施java.lang.Runnable并让它执行java.lang.Thread

1

问题是,您扩展了Thread并且没有在您的构造函数中调用显式的super()。因为Thread中不存在无参数构造函数,所以您需要显式调用超级cal中的某个公共构造函数。

当你实施Runnable而不是延长Thread你不会有问题。并使用new Thread(runnable)可以构造一个执行给定可运行实例的标准线程。

+0

好吧,我改变了它,所以它实现了RUnnable,并且这些状态没有问题。谢谢 – Giannis 2011-05-22 18:41:49

1

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

只需将您的班级状态重命名为MyState或任何其他名称即可。

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

+0

感谢您的回答。我想这就是我实施Runnable时修复的原因。 – Giannis 2011-05-22 18:53:01