Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我可以创建任意多的线程吗?_Java_Multithreading - Fatal编程技术网

Java 我可以创建任意多的线程吗?

Java 我可以创建任意多的线程吗?,java,multithreading,Java,Multithreading,我正在开发一个RESTWeb服务,它应该从客户端接收文件并处理它们。在收到文件之后,我想创建一个新线程来处理该文件,因此我不必等待处理函数的结束 如果我收到很多文件,我会创建很多线程。这样做有限制或危险吗 如果我收到很多文件,我会创建很多线程。这样做有限制或危险吗 有。我不确定线程的数量是否有限制,但在某个时候,您将耗尽内存。每个线程都有堆栈和其他本地存储,这些存储将累加起来 如果达到限制,我会通过不接受新连接来限制分叉的线程数。然后,其他连接将在TCP队列中等待,直到以前的请求完成 更好的机制

我正在开发一个RESTWeb服务,它应该从客户端接收文件并处理它们。在收到文件之后,我想创建一个新线程来处理该文件,因此我不必等待处理函数的结束

如果我收到很多文件,我会创建很多线程。这样做有限制或危险吗

如果我收到很多文件,我会创建很多线程。这样做有限制或危险吗

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

如果达到限制,我会通过不接受新连接来限制分叉的线程数。然后,其他连接将在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代码、通道选择器等来多路传输连接,您必须查看哪些连接可以读取

如果我收到很多文件,我会创建很多线程。这样做有限制或危险吗

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

如果达到限制,我会通过不接受新连接来限制分叉的线程数。然后,其他连接将在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代码、通道选择器等对连接进行多路复用,以查看哪些连接可以读取。

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

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

理论上,您可以创建机器可以处理的尽可能多的线程。线程数没有限制,但如果打开的线程数超过1000个,则机器速度可能会减慢

我很抱歉这么说,但你的问题表明你正在试图重新发明轮子

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


如果您正在执行作业,最后一点是不相关的。

理论上,您可以创建尽可能多的线程。线程数没有限制,但如果打开的线程数超过1000个,则机器速度可能会减慢

我很抱歉这么说,但你的问题表明你正在试图重新发明轮子

首先,人们在创建服务器时倾向于使用线程池。这可以防止应用程序创建额外的线程,从而提高性能。其次,所有现代服务器都使用NIO,并且不会为每个请求创建线程。第三,也是最后一点:为什么要开发已经开发的东西?有很多完美的JavaWeb服务器支持标准API。有很多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);
        }
    }
private static final int THREAD\u COUNT=10;
私有静态最终ThreadPoolExecutor池=新ThreadPoolExecutor(
线程计数,线程计数,10,TimeUnit.s,
新建LinkedBlockingQueue());
公共静态void submitAgentToPool(可运行线程){
试一试{
if(线程!=null){
LOG.info(“ActiveThreads:+pool.getActiveCount());
执行(线程);
}
捕获(例外e){
LOG.error(“启动线程时出现异常:+e.getMessage(),e”);
}
}
继续将您的线程添加到此池中…它将确保一瞬间仅运行10个线程使用线程池

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);
        }
    }
private static final int THREAD\u COUNT=10;
私有静态最终ThreadPoolExecutor池=新ThreadPoolExecutor(
线程计数,线程计数,10,TimeUnit.s,
新建LinkedBlockingQueue());
公共静态void submitAgentToPool(可运行线程){
试一试{
if(线程!=null){
LOG.info(“ActiveThreads:+pool.getActiveCount());
执行(线程);
}
捕获(例外e){
LOG.error(“启动线程时出现异常:+e.getMessage(),e”);
}
}

继续将您的线程添加到此池中…当您从客户端自动接收文件时,它将确保在瞬间仅运行10个线程