我有以下代码从套接字读取字符串并处理它。从套接字读取字符串后,我正在创建一个新线程来处理请求。这样,我可以让多个线程同时处理传入的请求。
public void process(Socket socket) throws Exception {
while (true) {
String request = readFromSocket(socket);
new Thread(() -> {
try {
System.out.println(request); // [edit]: I had omitted this line before as I thought it would be irrelevant
response = processRequest(request); // <-- request could get modified
} catch (Exception e) {
// TODO: Log error and print stack-trace
}
}).start();
}
}
这里的问题是,“请求”可能会在新线程开始处理它之前被修改。我是多线程的新手,我阅读了一些涵盖基础知识的网站。我仍然不确定如何解决这里的问题。
使用 synchronized 来等待新线程完成处理请求会破坏多线程的目的。一旦我收到请求,我想将它发送到一个新线程,以便它可以开始处理请求,而父线程可以读取下一个请求。
有关如何解决此问题的任何帮助?谢谢!
[在卢克回答后编辑]
在我的场景中,请求将是一个文件名。您可以根据目录的大小获得多个请求。当我在文件较少的目录上尝试我的代码时,一切都很好。但是当我对一个包含数千个文件的目录运行我的代码时,事情变得很奇怪。
说在 readFromSocket 之后,线程 1 有请求 X,线程 2 有请求 Y。但是在 processRequest() 中,线程 1 开始处理请求 Y。
您的代码存在各种问题。
正如您自己认为的那样,在 P 产生新结果之前,一个线程 P 产生可能被消耗的东西或不被另一个线程消耗的东西是不理想的。
因此,像您一样简单地存储值是不好的做法。合理的答案是:使用旨在允许“一个线程放入东西,其他线程取出东西”的数据结构;像ArrayBlockingQueue。
然后:为一项工作创建一个线程,然后将其丢弃是非常浪费时间的。
相反:创建一个ExecutorService,并将任务提交到该服务中。该服务可以基于一个线程池,可以重用;而不是扔掉。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句