什么是线程和并发(出现死循环的原因及对策)

什么是线程和并发(线程数越多越好吗)

很早的时候,就学习过死循环。

现在思考一个问题,如何运行两个死循环?

用开发工具写下代码,会发现编译会报错:

什么是线程和并发(线程数越多越好吗)

unreachable:不可能达到的。

statement:语句。

不可能达到的语句,为什么会这样呢?

其实很好理解,第一个while循环是死循环,如果我们不强行将程序停止的话,它是会无止境的永远运行下去的,那么第二个死循环语句根本就没法运行到。

所以开发工具会觉得你这条语句没有意义从而报错。

那如何解决这个问题呢?

就要引出我们今天的重点:线程。

一、线程与进程

线程,这个概念太重要的,据说面试基本都会问到和其相关的问题。

提到线程往往会想到另一个概念:进程。

什么叫进程呢?

我们打开电脑任务管理器,就能看到进程。

什么是线程和并发(线程数越多越好吗)

进程:指一个内存中运行的应用程序,一个应用程序可以同时运行多个进程。

那什么又叫线程呢?

线程:进程内部的一个独立执行单元,一个进程可以同时并发的运行多个线程。

这种官方定义理解起来有点抽象,做个简单的比喻:

进程就相当于是火车;线程就相当于是车厢 。

线程在进程下行进(车厢无法运行,它需要依赖火车)

一个进程可以包含多个线程(一辆火车可以有多个车厢)

线程消耗的资源比进程小的多(多个车厢比多列火车消耗资源少的多)

明白了线程与进程,我们还要了解下电脑cpu它是如何工作的?下图为一台笔记本电脑的性能图:

什么是线程和并发(线程数越多越好吗)

这台笔记本是:四核八线程,8逻辑处理器就是指8线程。

意思就是说这台笔记本电脑能在同一时间内同时执行8个线程,就相当于这台笔记本的cpu有8个人在帮它工作。

这又要引出两个概念:并行与并发。

二、并行与并发并行:同一时刻,同时发生。并发:同一时间段内发生,不是同时发生,但是因为完成的非常快速,看起来像是同时发生。

所以上图中,并行是8个,并发是3102个。

并行8个

因为电脑是四核八线程,有8个逻辑处理器,所以能同时执行8个线程。

并发3102个

因为电脑当前有3102个线程要处理,cpu一次只能执行8个线程,但是cpu太快太快了,它一个线程可能只要几毫秒,就迅速切换到下一个,人眼根本就反应不过来,所以感觉同时在发生。

并发并不是同时发生,而是CPU速度太快,感觉在同时发生。

所以阿里巴巴为何这么牛?看看双十一就知道了,双十一0点那一秒光订单量就有几十万,并发量是非常高的。

在这种高并发的情况下能保证程序不崩是需要一定的技术的。

我还记得周杰伦有次在QQ音乐发布专辑时,QQ音乐就崩了;最近好像网易云音乐也因为谁发布专辑崩了一次。就是因为并发量太高了,服务器处理不过来了。

我们有的时候玩单机游戏会感觉到明显的卡顿,单机游戏与网络无关,它为什么有时候会卡呢?

就是因为cpu“忙不过来了”,它还在处理其他的线程,单机游戏就没来得及处理,便有了卡顿。

所以面对这个问题有一个应急的土方法:

什么是线程和并发(线程数越多越好吗)

将游戏的线程优先级设置成最高,可以在一定程度上缓解卡顿。

当然这种方法治标不治本,不能从根本上解决这个问题,想根本上解决还是得提高配置或者换电脑。

因为CPU线程的调度是抢占式调度。

什么意思呢?

就是CPU处理那个线程是随机的,就算我将游戏的线程优先级设置成最高,也没法保证CPU一直都能处理它,还是会卡顿。

三、Java里的线程

Java中Java虚拟机也是抢占式调度。

线程在Java里同样也是一个类,Thread类,Thread就是线程的意思,在Java世界里,万事万物都可以是类……

回到一开始的问题:如何运行两个死循环?

就可以使用线程:

什么是线程和并发(线程数越多越好吗)

①自定义线程:

定义一个我们自己的线程,然后让它继承Java里的线程类Thread就好了。

②重写run方法:

在这里面就可以运行其中的一个死循环。

③main方法线程:

main方法本身也是一个线程,也就是主线程。

④创建自定义线程对象:

这不用多少,Java的特性面向对象,创建了对象,才好拿来直接使用。

⑤启动我们自定义的线程:

启动的时候,就会直接调用自定义线程类中的run方法。

现在加上主线程,一共就有两个线程了。

⑥主线程中还可以执行一个死循环

这样的话就可以运行两个死循环了,就相当于有两个人在同时工作。

这就是线程的作用。

总结

什么是线程和并发(线程数越多越好吗)

 

本文来自作者:星火网络,不代表小新网立场!

转载请注明:https://www.xiaoxinys.cn/353615.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。