我有这个问题我不知道如何解决,我处于疯狂的边缘。编程,嗯? :/
无论如何,我有一个服务器,它有一个线程向用户发送它需要的所有信息(需要不断运行)和另一个等待新服务器连接的线程。我的问题是一旦调用socket.accept()
,另一个线程就不会执行。
所以,用代码来解释:
class Thread1 extends Thread {
public void run() {
while(true)
{
s=socket.accept();
}
}
class Thread2 extends Thread {
public void run() {
//do stuff
System.out.println("spam");
}
}
public static void main(String[] args)
{
Thread1 t1 = new Thread1();
t1.start();
t1.Thread2 t2 = t1.new Thread2();
t2.start();
}
}
假设存在所有其他必需的成员变量,没有编译错误和连接功能正常工作。只是' Thread2'只执行一次。
所以我的问题是,如何解决这个问题?
提前致谢,
添
答案 0 :(得分:3)
一些建议
尝试以下操作(注意:您可以添加IOException处理代码)
class SocketAcceptor implements Runnable {
public void run() {
while(true) {
Socket s=socket.accept();
SocketHandler sh = new SocketHandler(s);
new Thread(sh).start();
}
}
}
class SocketHandler implements Runnable {
final Socket s;
SocketHandler(Socket s) { this.s = s; }
public void run() {
System.out.println("New connection " + s);
s.close();
}
}
更好的解决方案是使用线程池。例如一个ExecutorService,但我会先让它工作。
答案 1 :(得分:3)
我认为你对线程有一个基本的误解。让我们看看我们是否可以解决这个问题。
线程只是另一个执行管道。将它们视为具有特定指令集的任务。任务完成后,线程返回。非常简单的想法,对吧?
在您的示例中,Thread1
有一个无限循环,这意味着 无限运行且 无限期地接受客户。
但是,Thread2
只输出一些文字并返回。没有什么可以告诉它继续旋转'。
在main()
内,即使Thread2
是Thread1
的内部类(这是一种糟糕的形式,我可以添加),它实际上并没有强制线程继续运行。
您可能希望在包含新套接字的服务器类中添加Queue
,并Thread2
循环并检查条目。
首先,看看Thread
class。它的构造函数需要Runnable
,因此在处理线程时应该实现所有这些(即class Foo implements Runnable
然后new Thread(new Foo())
)。
如果您喜欢套接字,那么套接字 - 服务器架构上的某些further reading甚至协议设计都可能会让您受益匪浅。