如何理解java中线程的概念

线程是共享资源但独立运行的进程的执行单元。
进程是资源分配的单位,线程的存在依赖于进程。
线程创建速度快,切换成本低。
Java线程是通过Thread或Runnable实现的。
线程控制需要应用程序、资源共享但本地独立。
线程是轻量级的,只保留必要的资源。
线程有指令指针、堆栈、寄存器和私有数据区域。
只有掌握了线程的基础知识,多线程编程才能更加高效。
你自己掂量一下吧。

什么是线程

严格来说,线程是操作系统可以调度计算的最小单位。
它是参与过程并在过程中实际运行的单位。
其实很简单。
线程是进程内的单个控制流序列。
一个进程可以同时有多个线程;每个线程并行执行不同的操作。
我们先来说说最重要的事情。
线程是离散调度和分派的基本单位。
从调度上来说,它们被称为内核线程;它可以分为用户线程和混合调度线程。
还有一点就是同一个进程的多个线程共享该进程的所有系统资源;但每个线程都有一组独立的调用,以确保数据隔离和状态独立。
有寄存器环境和线程本地存储。
还有一个更重要的细节。
线程是轻量级实体,不直接拥有系统资源,仅通过 TCB 维护特定功能。

一开始我以为线程和进程是同一个概念,后来发现我错了。
线程是进程的一部分,但它们具有独立的属性。
等待还有一件事。
线程切换的成本远低于进程切换;这是因为线程不需要改变地址空间等核心资源。
很多人不关心这个,但我认为值得一试。

总结一下,线程的应用优势就是通过资源复用和同步来显着提高系统性能。
例如,Web 服务器为每个请求创建单独的线程,以避免进程创建的开销。
图形处理软件使用多线程并行渲染不同的图层,以缩短响应时间。
说实话,这件事相当复杂。
许多人在设计系统时没有充分利用线程。
在设计多线程应用程序时,我认为应该充分利用线程的并发性来提高任务并行性和系统性能。

电脑线程有什么用?

说实话,我们来谈谈线程。
当我第一次接触他们时,我很困惑。
感觉就像科幻电影中的几个人物在互相争斗。
但用了十年之后,我渐渐想通了,发现这确实不是谎言。

以我之前做过的一个项目为例,一个处理大量用户请求的服务器。
在单线程的时代,如果一个请求没有得到处理,堆积如山,用户骂她就可以了。
后来我改用多线程,嘿,它立刻就不同了。
想想看,就像一个人做饭一样,一根线就是一锅,所有的东西都要排队。
那么多线程呢?你打开三个炉子,一个用来烤蔬菜,一个用来炖肉,一个用来煎鸡蛋。
厨师还会时不时的检查一下火候。
效率高不高,一目了然。

有趣的是线程和CPU核心之间的关系。
以前我认为每个线程必须配备一个CPU核心,但后来发现事实并非如此。
现在很多服务器都采用了超线程技术。
一个物理核心运行两个线程,性能提升是实实在在的。
去年测试过1 2 核机器,单线程运行成绩一般。
但运行 8 个线程来运行计算任务的速度是隔壁具有 4 个核心和独占线程的机器的两倍。

说到线程安全,我印象特别深刻。
有一次,我在编写后台同步任务时,没有考虑到锁定机制,结果得到了一堆可笑的乱七八糟的数据。
简直就是灾难,重装系统也没用。
后来我向学长请教,他给我举了一个例子:就像两个服务员同时把菜放在同一个自助餐盘上。
如果不协调的话,最后一盘可能是一半红烧肉,一半沙拉。
现在在编写代码之前,我必须检查线程安全性,这太昂贵了。

线程用得好不好,其实还是要看场景。
在处理简单的计算任务时,多线程不一定有优势,但会因切换开销而降低速度。
我有一个朋友是做数据分析的。
他们的团队发现,在处理小型数据集时,单个线程速度更快。
但当数据量达到千万级时,多线程的好处就显现出来了。

我记得的数据是,Windows 1 0系统中平均每个用户每天创建的线程数在5 00个左右,但这个数字波动很大,取决于使用习惯。
但可以肯定的是,普通人现在正在使用计算机,在不知不觉中享受着线程带来的便利。
尝试打开网络浏览器,同时听音乐和观看视频。
这些都在后台的不同线程中工作。
如果没有线程,计算机就会成为一块落后的砖头。

多线程的一些概念

有两个主要组件:管理线程的线程池和分配工作的任务队列。
这样就省去了问题,而且速度更快。

如何使用线程池?首先,创建指定数量的线程并对作业进行排队。
线程继续从队列中获取作业。

任务队列必须是静态的;不应有任何缺陷。
您可以使用环形缓冲区。
不加锁的版本性能良好,但编写起来比较复杂。

怎样合适?如果CPU密度较高,则不要超过核心数。
如果IO密度高,则启用更多核心。
具体的公式可以在网上找到。

生产者-消费者模型非常实用。
生产者创建任务,消费者立即执行工作。

异步执行的重点是将耗时的工作卸载到后台线程,同时主线程继续执行其他操作。
日志双缓冲是正常的。

线程池主要解决耗时任务而不拖慢主线程。
您还可以重用线程,从而节省创建和销毁线程的精力。

数据争用是最烦人的。
这可以通过互斥锁或原子操作来完成。
死锁也是一个令人头疼的问题;别乱动锁。

代码示例如下所示:只要 C++1 1 版本可以工作。
但你必须自己调整参数。

这是用于线程池的。
具体的细节你必须自己去了解。