我可以创建尽可能多的线程吗?

时间:2012-08-01 15:52:22

标签: java multithreading

我正在开发一个REST Web服务,它应该从客户端接收文件并进行访问。之后我收到了我想要创建一个新线程来处理文件的文件,所以我没有义务等待处理函数的结束。

如果我收到很多文件,我会创建很多帖子。这样做有任何限制或危险吗?

5 个答案:

答案 0 :(得分:3)

  

如果我收到很多文件,我会创建很多帖子。这样做有任何限制或危险吗?

是的。我不确定线程​​数量是否有限制,但在某些时候 会耗尽内存。每个线程都有堆栈和其他将加起来的本地存储。

如果已达到限制,我将通过不接受新连接来限制您分叉的线程数。然后,其他连接将在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 :(得分:3)

当您从客户端接收文件时,它将以新线程处理。 线程数量受限于两件事: 1.应用程序服务器配置(例如,Jboss或Tomcat默认情况下可以同时处理100个线程); 2.有时似乎WS提供程序包含线程队列。例如,CXF默认情况下不允许同时处理10个线程(如果您不更改此配置)。

答案 2 :(得分:0)

最好的方法是使用Thread Pools,就线程创建而言,它将提供更好的性能(它们将被预先创建)和更好的资源管理,以避免系统过载和内存不足,例如。

答案 3 :(得分:0)

理论上,您可以创建机器可以处理的多个线程。线程数没有限制,但是如果你打开超过1000个线程,你的机器预计会变慢。

我很遗憾地说出来,但你的问题表明你正试图重新发明轮子。

首先,人们在创建服务器时倾向于使用线程池。这可以防止其应用程序创建额外的线程以提高性能。其次,所有现代服务器都使用NIO,不会为每个请求创建线程。第三,也是最后一个:你为什么要开发已经开发的东西?有很多完美的Java Web服务器支持标准API。有很多REST框架。一个即使是最有才华的程序员也没有机会开发出比合理时间内更好的Web服务器。

如果你正在实施家庭作业,最后一点是无关紧要的。

答案 4 :(得分:0)

使用ThreadPool ......

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个线程