本篇内容主要讲解“Java怎么创建多线程服务器”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java怎么创建多线程服务器”吧!
服务端接收到一个客户连接,就与客户进行通信,通信完毕后断开连接,然后接收下一个客户连接,假如同时有多个客户连接请求这些客户就必须排队等候。如果长时间让客户等待,就会使网站失去信誉,从而降低访问量。
一般用并发性能来衡量一个服务器同时响应多个客户的能力,一个具有好的并发性能的服务器,必须符合两个条件:
用多个线程来同时为多个客户提供服务,这是提高服务器并发性能的最常用的手段,一般有三种方式:
服务器的主线程负责接收客户的连接,每次接收到一个客户连接,都会创建一个工作线程,由它负责与客户的通信
服务器创建和销毁工作线程的开销很大,如果服务器需要与许多客户通信,并且与每个客户的通信时间都很短,那么有可能服务器为客户创建新线程的开销比实际与客户通信的开销还要大
除了创建和销毁线程的开销,活动的线程也消耗系统资源。每个线程都会占用一定的内存,如果同时有大量客户连接服务器,就必须创建大量工作线程,它们消耗了大量内存,可能会导致系统的内存空间不足
线程池中预先创建了一些工作线程,它们不断地从工作队列中取出任务,然后执行该任务。当工作线程执行完一个任务,就会继续执行工作队列中的下一个任务
可以根据系统的承载能力,方便调整线程池中线程的数目,防止因为消耗过量系统资源而导致系统崩溃
java.util.concurrent包提供了现成的线程池的实现,更加健壮,功能也更强大,更多关于线程池的介绍可以这篇文章
任何多线程应用程序都有死锁风险。造成死锁的最简单的情形是:线程A持有对象X的锁,并且在等待对象Y的锁,而线程B持有对象Y的锁,并且在等待对象X的锁,线程A与线程B都不释放自己持有的锁,并且等待对方的锁,这就导致两个线程永远等待下去,死锁就这样产生了
任何多线程程序都有死锁的风险,但线程池还会导致另外一种死锁:假定线程池中的所有工作线程都在执行各自任务时被阻塞,它们都在等待某个任务A的执行结果。而任务A依然在工作队列中,由于没有空闲线程,使得任务A一直不能被执行。这使得线程池中的所有工作线程都永远阻塞下去,死锁就这样产生了
如果线程池中的线程数目非常多,这些线程就会消耗包括内存和其他系统资源在内的大量资源,从而严重影响系统性能
线程池的工作队列依靠wait()和notify()方法来使工作线程及时取得任务,但这两个方法都难以使用。如果编码不正确,就可能会丢失通知,导致工作线程一直保持空闲状态,无视工作队列中需要处理的任务
对于工作线程数目固定的线程池,如果工作线程在执行任务时抛出RuntimeException或Error,并且这些异常或错误没有被捕获,那么这个工作线程就会异常终止,使得线程池永久地失去了一个工作线程。如果所有的工作线程都异常终止,线程池变为空,没有任何可用的工作线程来处理任务
导致线程泄漏的另一种情形是,工作线程在执行一个任务时被阻塞,比如等待用户的输入数据,但是由于用户一直不输入数据(可能是因为用户走开了),导致这个工作线程一直被阻塞。这样的工作线程名存实亡,它实际上不执行任何任务了。假如线程池中所有的工作线程都处于这样的阻塞状态,那么线程池就无法处理新加入的任务了
当工作队列中有大量排队等候执行的任务,这些任务本身可能会消耗太多的系统资源而引起系统资源缺乏
如果任务A在执行过程中需要同步等待任务B的执行结果,那么任务A不适合加入线程池的工作队列中。如集把像任务A一样的需要等待其他任务执行结果的任务加入工作队列中,就可能会导致线程池的死锁
如果执行某个任务时可能会阻塞,并且是长时间的阻塞,则应该设定超时时间避免工作线程永久地阻塞下去而导致线程泄漏
了解任务的特点,分析任务是执行经常会阻塞的IO操作,还是执行一直不会阻塞的运算操作。前者时断时续地占用CPU,而后者对CPU具有更高的利用率。根据任务的特点,对任务进行分类,然后把不同类型的任务分别加入不同线程池的工作队列中,这样可以根据任务的特点分别调整每个线程池
调整线程池的大小,线程池的最佳大小主要取决于系统的可用CPU的数目以及工作队列中任务的特点。假如在一个具有N个CPU的系统上只有一个工作队列并且其中全部是运算性质的任务,那么当线程池具有N或N 1个工作线程时,一般会获得最大的CPU利用率
如果工作队列中包含会执行IO操作并经常阻塞的任务,则要让线程池的大小超过可用CPU的数目,因为并不是所有工作线程都一直在工作。选择一个典型的任务,然后估计在执行这个任务的过程中,等待时间(WT)与实际占用CPU进行运算的时间(ST)之间的比:WT/ST。对于一个具有N个CPU的系统,需要设置大约N(
1 WT/ST)个线程来保证CPU得到充分利用
避免任务过载,服务器应根据系统的承受能力,限制客户的并发连接的数目。当客户的并发连接的数目超过了限制值,服务器可以拒绝连接请求,并给予客户友好提示。
到此,相信大家对“Java怎么创建多线程服务器”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!