介绍
在学习 Java 线程之前,让我们先展望一下不久的将来。想象一下您提交了简历并进行了面试。您和几十位未来的同事已被邀请到一家大型软件公司工作。除了其他麻烦之外,您还需要向疲惫的人力资源员工提交纸质就业文件。
为了加快流程,该职位的申请人可以分为两组,并分配给两名人力资源经理(如果公司有的话)。因此,我们通过并行
设计工作加快了流程。
如果公司里只有一名人事主管,那么你就必须想办法离开。例如,你可以再次将每个人分成两组,例如依次采访女孩和男孩。
或者根据另一个原则:由于下层的人多,我们就用两个女孩换一个男孩。
这种组织工作的方式称为
多线程。我们疲惫不堪的人力资源主管会切换到不同的团队,从他们中招募下一位员工。大概有十一个小组和四名人事官员。在这种情况下,多线程
处理将由多个 HR 并行进行,他们可以从任何组中挑选下一个人来处理他的文档。
流程
这种情况下的流程(
process)将是文件接收工作的组织。在一个组织中,可以区分多个流程:会计、软件开发、与客户的会议、仓库运营等。为每个流程分配资源:场所、执行员工。这些流程相互隔离:人力资源官员无法访问会计数据库,客户服务经理也不会在仓库周围跑来跑去。如果一个进程需要访问别人的资源,就需要建立进程间的通信:备忘录、联席会议。
流
进程中的工作被组织成线程(
java thread
)。对于人力资源部门来说,流程是为团队服务的工作组织。在第一张图片中有一个流程,在接下来的三张图片中有两个流程。在该流程中,线程可以并行执行 - 两名人力资源官员接受两组或更多组未来员工。人事官员与组的交互(进程内线程的处理)称为
线程同步。一名人事官员设计的两组的图纸显示了方法:制服(女孩 - 男孩 - 女孩 - 男孩)和不同的优先级(两个女孩与一个男孩交替)。线程可以访问它们所属进程的资源:向人力资源官员的组提供申请表样本、用于填写文档的笔。但如果流与它们共有的事物相互作用,那么就有可能发生事件。如果人事官员要求你喊出队列中最后一个人的名字,那么,在两组的情况下,他事先不确定他会听到女人的名字还是男人的名字。此类数据访问冲突、阻塞以及解决方法是一个非常重要的话题。
流动状态
每个线程都处于以下状态之一:
- 已创建 (
New
) – 人力资源官员的队伍已准备就绪,人员正在组织起来。
- 已启动 (
Runnable
) – 我们的队列已为人力资源官员排队并正在处理中。
- 被阻止(
Blocked
)——队列中最后一个年轻人试图喊出一个名字,但当他听到下一组的女孩在他之前开始这样做时,他沉默了。
- 已完成 (
Terminated
) - 整个队列已由人力资源官员完成,无需再做。
- Waiting(
Waiting
) – 一个队列正在等待来自另一个队列的信号。
线程的组织及其交互是进程有效运行的基础。
让我们回到IT世界
在 21 世纪,多线程和并行执行已经变得重要。自上世纪 90 年代以来,多任务操作系统 Windows、MacOS 和 Linux 已在家用计算机上牢固确立。您通常可以在其中找到四个或更多核心处理器。GPU显卡的并行块数已经超过千个。流行的程序在编写时考虑了多线程(多线程),例如,用于处理图形、视频或处理大量数据的现代版本软件:Adobe Photoshop、WinRar、Mathematica、现代游戏。Java 多线程是一个非常重要、流行且复杂的话题。因此,在JavaRush课程中有很多任务需要很好地理解它。关于多线程的 Java 示例将帮助您掌握该领域的基本细微差别和微妙之处,同步线程的工作。
过程
进程是操作系统 (OS) 为其分配内存、处理器时间/核心和其他资源的程序的运行实例。重要的是内存是单独分配的;不同进程的地址空间不能互相访问。如果进程需要通信,它们可以使用文件、管道和其他进程间通信方法来实现。
流动
Java
Thread
(流)。有时,为了避免与其他Java类等混淆
Stream
,Java线程常常被翻译为线程。它们使用分配给进程的资源,并且是进程执行的方式。主线程执行该方法
main
并退出。当进程执行时,可以产生额外的线程(子线程)。同一进程的线程之间可以交换数据。Java多线程需要考虑数据同步,不要忘记这一点。在 Java 中,进程在其最后一个线程完成时终止。对于后台任务,线程可以作为守护进程(daemon
daemon
)启动,与常规任务不同的是,当
daemon
进程的所有非线程终止时,它们将被强制终止。
第一个多线程应用程序
创建线程的方法有六种以上;在 JavaRush 课程中我们将详细研究它们。首先,让我们熟悉一个基本的。有一个特殊的类,您需要
Thread
在其方法
run()
中编写实现程序逻辑的代码。创建线程后,可以通过调用
start()
. 让我们编写一个演示程序来实现 Java 多线程的示例。
class PeopleQueue extends Thread {
private String[] names;
PeopleQueue(String... names) {
this.names = names;
}
@Override
public void run() {
for (int i = 0; i < names.length; i++) {
System.out.println("Обработаны documentы: " + names[i]);
try {
sleep(500);
} catch (Exception e) {}
}
}
}
public class HR {
public static void main(String[] args) {
PeopleQueue queue1 = new PeopleQueue("Ivan","Сергей","Николай","Фердинанд","Basil");
PeopleQueue queue2 = new PeopleQueue("Мария","Людмила","Алиса","Карина","Olga");
System.out.println("Начали!");
queue1.start();
queue2.start();
}
}
让我们启动该程序。控制台显示主线程输出的消息。接下来,每个子线程
queue1
依次
queue2
将有关下一个处理的员工的消息输出到其公共控制台。该计划的可能选项之一:
Начали!
Обработаны documentы: Мария
Обработаны documentы: Ivan
Обработаны documentы: Людмила
Обработаны documentы: Сергей
Обработаны documentы: Алиса
Обработаны documentы: Николай
Обработаны documentы: Карина
Обработаны documentы: Фердинанд
Обработаны documentы: Ольга
Обработаны documentы: Васorй
Process finished with exit code 0
Java 中的多线程是一个复杂且多方面的主题。使用并行、多任务和多线程计算编写代码的能力将帮助您在现代多核处理器和由许多计算机组成的集群上有效地执行任务。
GO TO FULL VERSION