线程池

来源:互联网 发布:局域网多线程编程 编辑:程序博客网 时间:2024/04/29 23:38

1.背景

为了提高程序的运行效率,Java引入了多线程机制。在初期阶段,或者说在项目规模不大的情况下,我已经习惯了简单地使用多线程来解决一些问题。但是一旦项目的规模增大,用户的人数增多。特别是带有社交性质的网站或者游戏,往往用户数量至少都是百万级的,甚至以亿计,那么每秒钟用户发出的请求数量也会达到相同的级别。

其实,在面向对象的编程过程中,创建和销毁对象都是很费时间和内存资源的。因为,如果你要创建一个对象,首先要去获取内存资源还有其它资源。那么当你创建很多线程对象的时候,比如说为了响应用户的请求而创建的线程对象,系统的资源可能很快就被消耗完了。所以说,比较好的做法是将某一段时间里面处理的请求数减少。


2.理论上是怎么回事呢

假如一台服务器里面的程序可以接收和处理用户提交的请求,当一个请求到来的时候,服务器为这个请求创建一个线程专门进行处理。

假设创建线程的时间为t1,处理请求的时间为t2,销毁线程的时间为t3。那么总共花费的时间t就简单表示为 t=t1+t2+t3。其实假如不是使用多线程的话,t1和t3都是多余的,我们花费的只是t2。所以说呢,理想的情况是尽可能地减少t1和t3。

线程池可以重复利用已有的线程,这样的话,创建和销毁的时间开销就大大减少了。除此之外,因为线程之前就创建好了,那么当请求到达的时候,就可以直接执行,而不用再花掉t1的时间去创建了。而且,因为你可以调整线程池里面线程的数量,这样的话,你可以在一定程度上控制内存的开销。如果有更多的请求来了,那么就让它们等一下,直到有线程空闲了为止,以防出现内存泄漏。


3.怎样确定是不是要用线程池呢

其实没有一个定准,有时候每到一个请求就创建一个线程是完全合理的,这个度怎么把握呢?有一个大概的约定,那就是,如果你创建的线程需要执行的时间比较短,但是需要创建的线程数又很多,那一定使用线程池。当你的线程需要执行的时间很长,线程数量又不多的时候,这个时候就可以每来一个请求就单独创建一个线程来为它服务。但是呢,其实大多数的服务器程序都是想要处理大量的短周期的任务。那么使用线程池不仅可以减少时间开销,还可以帮助开发者监控资源和时间的消耗。


4.工作队列

线程池这个词在java之前就出现了,并且一直用到今天,但是其实它并没有正确地描述这个机制。按照线程池这个词语的意思,我们可以简单地实现一个线程池类,客户端可以等待空闲的线程,一旦等到就将任务发给这个线程来执行,任务完成之后将这个线程返回给线程池,但是这个做法有几个潜在的不好的影响。假如线程池空了怎么办? 那样的话用户的请求就可能会被阻止了。

我们真正想要的是一个工作队列,一组固定数量的线程,然后使用wait()和notify()方法来唤醒空闲线程,告诉它们有新的任务来了。这个工作队列通常是被包装成为一个Linked List之类的东西,然后附带一个监控对象。





原创粉丝点击