Ber*_*ard 7 java networking multithreading tcp thread-safety
在Thread调用之后,start()如您所知,它将调用该类中的run()函数Runnable.在run()我想要的函数中,只要从客户端收到"Bye"消息,线程就会保持不变.如果我把它们放在while循环中,它会占用大量的内存,我想我并没有使用线程的强大功能.顺便说一句,我不希望我的线程在运行函数中通过调用睡眠Thread.sleep(6000);是否有任何其他方式保持在运行功能?
如果答案是加入何处以及如何使用它?我应该在运行功能的开头弹出它并保持在那里直到我从客户端发送"再见"吗?
我该说while((request=in.readLine())!=null){吗?它不起作用,因为我认为它会失去与客户的联系或更好地说客户失去连接?
while(Thread.isAlive)当我收到"再见"时,我应该说并然后杀死威胁,Thread.stop这有点危险吗?
这是我的简化代码:
while(true)
{
ClientWorker w;
try
{
w = new ClientWorker(serverSocket.accept());
Thread t = new Thread(w);
t.start();
}
...... }
class ClientWorker implements Runnable {
public ClientWorker(Socket incoming)
{
myList = my;
this.incoming = incoming;
}
public synchronized void run()
{
in = new BufferedReader(new InputStreamReader(incoming.getInputStream()));
.
.
..
...
}
Run Code Online (Sandbox Code Playgroud)
在最简单的情况下,让你的run方法完成它的工作并在适当时终止,如下所示:
public void run() {
boolean running = true;
while(running) {
running = doWork();
if (Thread.interrupted()) {
return;
}
}
}
Run Code Online (Sandbox Code Playgroud)
这里,当doWork()方法返回false时,进程停止.允许您的线程被中断也是一种很好的风格,特别是如果它需要运行很长时间,请参阅本教程.要使其中任何一个工作,doWork()应该定期返回.注意,无法重新启动线程,一旦run方法返回,系统就会回收线程.
如果需要更多控制线程,可以创建单独的Worker和ThreadManager类.
要让ThreadManager终止Worker,请在Worker中创建一个volatile布尔字段,并定期检查:
public class Worker extends Thread {
private volatile boolean running;
public void run() {
running = true;
while(running) {
running = doWork();
if (Thread.interrupted()) {
return;
}
}
}
public void stopRunning() {
running = false;
}
}
Run Code Online (Sandbox Code Playgroud)
工作人员在中断或工作完成时结束.此外,ThreadManager可以通过调用stopRunning()方法请求Worker停止.
如果你的线程用完了,它也可以调用ThreadManager上的wait()方法.这会暂停线程,直到通知有新的工作要做.当新工作到达时,ThreadManager应调用notify()或notifyAll()(在此示例中,ThreadManager用作监视器).
使用这种方法,您可以保持工人简单,只关心工作.ThreadManager确定线程数并使其可用,但不需要知道实际工作的详细信息.更进一步的是将"工作"分成一个单独的类,你可以称之为Job.可以在我的webcrawler示例中找到此示例.这对于将新工作从ThreadManager传递到工作线程非常有用.