首页 > 编程知识 正文

多线程 java(多线程 多进程)

时间:2023-05-04 11:50:31 阅读:77936 作者:4314

一.线程和进程的区别

首先简要介绍线程和进程的概念。

(1)进程是指在存储器上运行的APP应用,例如在Windows系统中,运行的exe是进程。

)2)线程是指进程中的执行进程。

区别:

该程序至少有一个进程,该进程至少有一个线程。 一个APP应用程序可以同时启动多个进程。 例如,对于IE浏览器程序,每次打开IE浏览器窗口时都会启动一个新过程。 线程是指进程中的一个运行进程。 一个进程可以有多个线程,每个线程都执行不同的任务。 如果进程中的多个线程同时运行,则此运行方法称为并发运行。

此外,线程和进程之间存在非常重要的差异。 每个进程在运行时都有独立的内存单元,同一进程中的多个线程共享内存,从而大大提高了程序的执行效率。

二、对多线程并发性的理解

多线程并发是表面上和感官上的并发,而不是实质上的并发。 一个线程必须占用CPU才能运行,但由于当前使用的计算机大多是单CPU,因此一次最多只能检索和运行一个线程。

多线程的本质是“充分利用CPU资源”,如果处理一个线程不需要占用CPU,而只需要与I/O等资源进行交互,则允许其他线程获得CPU资源。 这类似于“统一的方法”。 例如,假设让别人打扫房子和烧水。 要在最短的时间内完成这两件事,你会想到先把水烧热,然后在等水烧热的空闲时间打扫房子。 不是先打扫干净再烧水,而是先烧热再打扫。 在这个例子中,你是那个唯一的CPU。 然后,烧水打扫的是两个线程。

虽然只有一个CPU,但它经常在多个线程之间切换。 当切换频率增加到一定程度时,所有线程似乎都在同时运行。 因此,我觉得这些线程好像在同时运行。 因此,并发并不意味着多个线程同时运行,而只是一种现象。 就像把某人说成“铁人”一样,只是有人表示不怕痛苦和疲劳,就像“铁人”。

1 .并发:在操作系统中,某个时间段内有几个程序从启动运行到运行完成,这意味着这些程序在同一处理器上运行。 这两种同时关系分别是同步和互斥的

2 .互斥:进程之间相互排他地使用临界资源的现象称为互斥。

3 .同步:过程之间的关系不是相互排斥临界资源的关系,而是相互依赖的关系。 进一步说明:将上一个进程的输出作为下一个进程的输入,如果第一个进程未输出,则第二个进程必须等待。 一组具有同步关系的并发进程相互发送的信息称为消息或事件。

其中有伪同时性和真同时性。 伪同时性是指单核处理器的同时性,真同时性是指多核处理器的同时性。

4 .并行处理:在单处理器内的多个编程系统中,表现进程交替运行、同时运行的外部特殊; 在多处理器系统中,过程不仅可以交替执行,还可以重叠执行。 多处理器上的程序可以实现并行处理。 因此,可以看出并行化是针对多处理器的。 并行是同时发生的多个同时事件,意味着同时发生,但不一定同时发生。 也就是说,同时事件之间不一定在同一时刻发生。

5 .多线程:多线程是编程逻辑层的概念,是进程中同时执行的代码。 多线程可以实现线程之间的切换执行。

6 .异步:异步和同步是相对的,同步是指按顺序执行。 执行一个再执行下一个,需要等待,协调执行。 异步是指相互独立,在等待某个事件的时候继续做自己的事情。 你不需要等这件事完成后再工作。 线程是实现异步的一种方法。 异步是指调用该方法的主线程不需要同步等待另一个线程的完成,而是允许主线程做其他事情。

异步和多线程不是相同的关系。 异步是最终目的,多线程只是实现异步的手段。 异步是指将调用请求发送到调用方,调用方可以进行其他操作,而无需等待其结果返回。 实现异步可以交给多线程技术或其他进程。

为了更好地理解以上概念,举个简单的例子,假设我要做三件事:烧水,举起杠铃100次,洗衣服。

烧水,我要做的是准备烧水一分钟,等待烧水八分钟,关掉热水器一分钟

举100次杠铃我要做的就是举100次杠铃10分钟

我要做的就是准备洗衣服1分钟,等待水开5分钟,关掉洗衣机1分钟

单核时

的同步已完成。 我必须要做的时间是1 8 1 10 1 5 1=27分钟

如果是异步的话,在等待的时候,我可以切换做别的事情

烧水准备(1)洗衣服准备)1)举起杠铃50次;5 )关掉洗衣机;1分钟举起杠铃20次;2 )关掉热水器;1分钟举起杠铃30次;3 )分钟

1 1 5 1 2 1 3=14分钟

双核异步并行处理

核1烧水准备1分钟杠铃50次(5分钟),等待3分钟,关闭热水器1分钟

核2准备洗衣服1分钟举起杠铃50次,关掉洗衣机(5分钟),等待1分钟,等待3分钟

实际上,1 5 3 1=10分钟就花了

其中双核也等了三分钟

双核异步异步异步并行

1将杠铃抬起100次(10分钟)

核2准备烧水准备洗一分钟等一分钟等五分钟关掉热水器等一分钟等一分钟

关掉洗衣机 1分钟

其实只花了 1+5+3+1 = 10分钟

多线程的做法

单核下

线程1 准备烧开水 1分钟, 等开水烧开 8 分钟 , 关掉烧水机 1分钟

线程2 举杠铃100下 10分钟

线程3 准备洗衣服 1分钟, 等开水烧开 5 分钟 , 关掉洗衣机 1分钟

cpu 可能这么切换 最理想的切换方式

线程1 准备烧开水1 sleep 1 sleep 5 sleep 1 sleep 2 关开水 1分钟 exit

线程2 sleep 1 sleep 1 举杠铃50 5分钟 sleep 1 举杠铃20 2分钟 sleep1 举杠铃30下 3分钟

线程3 sleep 1 准备洗衣服1 分钟 sleep 5 关洗衣机1分钟 exit

最后使用了 14分钟 和异步是一样的。

但是实际上是不一样的,因为线程不会按照我们设想的去跑, 如果线程2 举杠铃先跑,整个流程的速度就下来了。

异步和同步的区别, 在io等待的时候,同步不会切走,浪费了时间。

如果都是独占cpu 的业务, 比如举杠铃的业务, 在单核情况下 多线和单线 没有区别。

多线程的好处,比较容易的实现了 异步切换的思想, 因为异步的程序很难写的。多线程本身程还是以同步完成,但是应该说

比效率是比不上异步的。 而且多线很容易写, 相对效率也高。

多核的好处,就是可以同时做事情, 这个和单核完全不一样的。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。