多线程的服务器

http://expert.51cto.com/art/200702/40204_all.htm

许多实际应用要求服务器具有同时为多个客户提供服务的能力。用多个线程来同时为多个客户提供服务,这是提高服务器的并发性能的最常用的手段。主要有3种方式来实现:
- 为每个客户分配一个工作线程
- 创建一个线程池,由其中的工作线程来为客户服务
- 利用java.util.concurrent包中现成的线程池,由它的工作线程来为客户服务。

第一种方式的不足之处:
- 需要频繁地创建和销毁线程,如果线程执行的任务本身很简短,那么有可能服务器在创建和销毁线程方面的开销比在实际执行任务上的开销还要大。

  • 除了创建和销毁线程的开销之外,活动的线程也消耗系统资源。每个线程本身都会占用一定的内存(每个线程需要大约1M内存),如果同时有大量客户连接服务器,就必须创建大量工作线程,它们消耗了大量内存,可能会导致系统的内存空间不足。

  • 如果线程数目固定,并且每个线程都有很长的生命周期,那么线程切换也是相对固定的。不同操作系统有不同的切换周期,一般在20毫秒左右。这里所说的线程是指在Java虚拟机,以及底层操作系统的调度下,线程之间转让CPU的使用权。如果频繁创建和销毁线程,那么将导致频繁地切换线程,因为一个线程被销毁后,必然要把CPU转让给另一个已经就绪的线程,使该线程获得运行机会。在这种情况下,线程之间的切换不再遵循系统的固定切换周期,切换线程的开销甚至比创建及销毁线程的开销还大。

线程池为线程生命周期开销问题和系统资源不足问题提供了解决方案。线程池中预先创建了一些工作线程,它们不断从工作队列中取出任务,然后执行该任务。当工作线程执行完一个任务时,就会继续执行工作队列中的下一个任务。线程池具有以下优点:
- 减少了创建和销毁线程的次数,每个工作线程都可以一直被重用,能执行多个任务。
- 可以根据系统的承载能力,方便地调整线程池中线程的数目,防止因为消耗过量系统资源而导致系统崩溃。

猜你喜欢

转载自blog.csdn.net/zjpp2580369/article/details/82633355