启动一个线程后,我们怎么能保持run函数运行?我有很多想法,但我不确定哪个更专业?

Ber*_*ard 7 java networking multithreading tcp thread-safety

Thread调用之后,start()如您所知,它将调用该类中的run()函数Runnable.在run()我想要的函数中,只要从客户端收到"Bye"消息,线程就会保持不变.如果我把它们放在while循环中,它会占用大量的内存,我想我并没有使用线程的强大功能.顺便说一句,我不希望我的线程在运行函数中通过调用睡眠Thread.sleep(6000);是否有任何其他方式保持在运行功能?

  1. 如果答案是加入何处以及如何使用它?我应该在运行功能的开头弹出它并保持在那里直到我从客户端发送"再见"吗?

  2. 我该说while((request=in.readLine())!=null){吗?它不起作用,因为我认为它会失去与客户的联系或更好地说客户失去连接?

  3. 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)

Adr*_*ter 9

在最简单的情况下,让你的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传递到工作线程非常有用.