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

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

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

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

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方法。

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

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

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

这就是线程的作用。

总结

发布于 2022-08-03 23:07:28
收藏
分享
海报
0 条评论
10
上一篇:如何搭建代理服务器(代理服务器是什么) 下一篇:天燃气安全小贴士(煤气灶和天燃气灶能通用吗)
目录

    0 条评论

    本站已关闭游客评论,请登录或者注册后再评论吧~

    忘记密码?

    图形验证码