Java多线程的应用

一般只要是产生的CPU资源浪费,就需要多线程来提升效率。

我们举一个例子,例如一个网络爬虫项目,其中有两个环节

1.数据抓取:假设平均每个网站的抓取大约需要50ms。

2.数据处理(遍历数据):假设每个网站的数据处理需要

这样的话如果使用单线程,平均处理每个网站的时间大约是52ms。其实这样已经产生的大量的资源浪费。

在CPU进行数据抓取的50ms时,CPU的数据处理没办法进行,所以就要等50ms,之后再处理2ms,这样才会处理完成一个网站。

如果我们采取多线程来抓取数据。我们在这里的说法全部是理想状态下,不考虑线程之间的切换损耗的资源。

 这里有两种方案,一种是同事开启25个线程,然后同时抓取网站的信息。然后抓取完成后的线程就可以去处理数据,其他的线程互不干扰,这里有一种说法,就是同时启动,同时抓取,这样跟单线程有什么区别吗?还是会等待。这里我们举一个例子。

我们在进行1000米长跑的时候,相信大家都遇到过这样的一种情况,25个人同时起跑,第一圈可能差不多同时到达,但是慢慢的,队伍就会被拉长,原因就是每个人的具体速度是不一样的。这样渐渐的就会散列开来,类似于这样:

因为具体的抓取时间可能因为网站的内容不一致,和网速的种种原因,造成每个网站抓取的时间不太一样,所以我们这里用的是平均时间,散列开来的话就会形成上面的局面,这样CPU就会很充分被使用了。

还有一种情况,就是开启26个线程,其中25个线程负责网站的抓取,其中的一个专门负责处理。这样开启或者改变,再或者关闭线程的时候就需要对那一个负责处理的线程进行数据通信,告诉他是改变还是关闭。

这种情况相信大家都很容易理解,25个线程的抓取网站的时间差不多与1个处理数据的线程速度等同。

这就是一个真实的项目用到的多线程的样例。

猜你喜欢

转载自blog.csdn.net/qq_36186690/article/details/82987909