我正在开发一个 REST Web 服务,它应该从客户端接收文件并处理它们。之后我收到文件我想创建一个新线程来处理文件,所以我没有义务等待处理函数结束。
如果我收到很多文件,我会创建很多线程。这样做有什么限制或危险吗?
我正在开发一个 REST Web 服务,它应该从客户端接收文件并处理它们。之后我收到文件我想创建一个新线程来处理文件,所以我没有义务等待处理函数结束。
如果我收到很多文件,我会创建很多线程。这样做有什么限制或危险吗?
如果我收到很多文件,我会创建很多线程。这样做有什么限制或危险吗?
就在这里。我不确定线程数是否有限制,但在某些时候你会耗尽内存。每个线程都有堆栈和其他将加起来的本地存储。
如果已达到限制,我将通过不接受新连接来限制您分叉的线程数。然后其他连接将在 TCP 队列中等待,直到先前的请求完成。
更好的机制可能是使用固定ExecutorService
线程池,而不是为每个请求派生一个新线程:
// create a thread pool with 10 workers
ExecutorService threadPool = Executors.newFixedThreadPool(10);
while(!shutdown) {
// receive a request from your service -- this is tricky
// process it using the thread pool
threadPool.submit(new MyRequest(...));
}
...
// once we have submitted all jobs to the thread pool, it should be shutdown
threadPool.shutdown();
棘手的部分是如何确定哪些连接是可读的。这需要 NIO 代码、通道选择器等来复用您必须查看哪些连接可以读取。
当您从客户端收到文件时,它将自动在新线程中处理。线程数量受两点限制: 1. 应用服务器配置(例如 Jboss 或 Tomcat 默认可以同时处理 100 个线程);2. 有时似乎 WS 提供程序包含线程队列。例如,默认情况下 CXF 不允许同时处理 10 个线程(以防您不更改此配置)。
例如,最好的方法是使用线程池,这将提供更好的线程创建性能(它们将是预先创建的)和更好的资源管理,以免系统过载和内存不足。
从理论上讲,您可以创建机器可以处理的尽可能多的线程。线程数没有限制,但如果您打开超过 1000 个线程,您的机器预计会变慢。
我很抱歉这么说,但您的问题表明您正在尝试重新发明轮子。
首先,人们在创建服务器时倾向于使用线程池。这可以防止他们的应用程序创建额外的线程以提高性能。其次,所有现代服务器都使用 NIO,并且不会为每个请求创建线程。第三,也是最后一个:你为什么要开发已经开发的东西?有很多完美的支持标准 API 的 Java Web 服务器。有很多 REST 框架。即使是最有才华的程序员也没有机会开发出比在合理时间内运行得更好的 Web 服务器。
如果您正在实施家庭作业,最后一点是无关紧要的。
使用线程池...
private static final int THREAD_COUNT = 10;
private static final ThreadPoolExecutor pool = new ThreadPoolExecutor(
THREAD_COUNT, THREAD_COUNT, 10, TimeUnit.SECONDS,
new LinkedBlockingQueue<Runnable>());
public static void submitAgentToPool(Runnable thread) {
try {
if(thread != null) {
LOG.info("ActiveThreads :" + pool.getActiveCount());
pool.execute(thread);
}
catch (Exception e) {
LOG.error("Exception while Starting thread: " + e.getMessage(), e);
}
}
继续将你的线程添加到这个池中......它将确保瞬间只有 10 个线程在运行