自从我发现套接字以来,我一直在使用非阻塞变体,因为我不想费心学习线程。从那以后,我在线程方面积累了更多经验,我开始问自己......你为什么要把它用于套接字?
线程的一个大前提似乎是它们只有在处理自己的数据集时才有意义。一旦您有两个线程处理同一组数据,您将遇到以下情况:
if(!hashmap.hasKey("bar"))
{
dostuff // <-- meanwhile another thread inserts "bar" into hashmap
hashmap[bar] = "foo"; // <-- our premise that the key didn't exist
// (likely to avoid overwriting something) is now invalid
}
现在想象一下 hashmap 将远程 IP 映射到密码。你可以看到我要去哪里。我的意思是,当然,这种线程交互出错的可能性很小,但它仍然存在,为了保证程序的安全,你必须考虑每一种可能性。与简单的单线程工作流相比,这将显着增加设计工作量。
我可以完全看到线程对于处理单独的数据集或对于显式优化以使用线程的程序是多么的好。但是对于“一般”情况,程序员只关心发送一个工作和安全的程序,我找不到任何理由使用线程而不是轮询。
但是看到“单独的线程”方法非常普遍,也许我忽略了一些东西。开导我!:)