1. 进程与线程
1,首先进程是比较重量级的,有单独的内存区域,所以进程比较安全(没人跟你抢地方,除非你自己又建立几个线程,那就是线程的事情了)。当然安全是有代价的——建立和销毁进程的开销远大于线程。
2,线程是比较轻量级的,但是因为线程会共享内存,导致可能出现安全性问题。所以务必要保证多个线程访问同一资源时,要么这些线程都不改变资源,要么在改变资源的情况下同一时间只有一个线程可以改变资源(同时的情况下只有一个线程独占资源)。
2. 线程的情况
1,毫无疑问,使用多个线程比使用多个进程处理任务速度要快。
2,一个Java虚拟机可以创建多少个进程是不好说的,因为有的进程可能浪费很多资源(比如一个进程疯狂的开几百个线程同时访问很多资源)。最简单例子,咱们看下windows资源管理器里面占用内存最小的几个进程,可见最小的进程占用24K内存,好大一块哦,可见进程是创建不了多少的。
3,那么线程能创建多少呢,这个是有个大约的数字的。一般的服务器最大的并发线程数在几千到几万,至于到底能并发多少还得看服务器配置、线程具体占用资源情况。
4,如果线程太多呢,当然内存就耗尽了,然后Java虚拟机没内存可以用就快要GG了。
3. 线程池
1,实际上大多数情况下是不需要建立几百甚至上千个线程的,一般情况下100个线程处理能力就很强了,通过使用线程池可以极大的提高线程的利用效率。
2,所谓的线程池就是搞上一些线程,完成任务后不销毁,而是标记为空闲状态,然后这些线程再给其他排队的任务用。
3,因为不用为每个任务生成新线程,不用一直销毁、新建线程,所以会节省很多开销。
4,一般来说100个线程处理300-900个连接问题不大,因为连接并不会集中发生,具体的情况还要以实际测试为准。