Jadual Kandungan
进程概述
线程概述
进程与线程的关系
java程序运行原理
涉及到多线程的内容分成几部分:
扎好马步:线程的状态(五种)
内功心法:每个对象都有的方法
太祖长拳:基本线程类
九阴真经:高级多线程控制类
Rumah Java javaTutorial java中的多线程知识的总结分析

java中的多线程知识的总结分析

Sep 18, 2018 pm 05:17 PM
java multithreading

本篇文章给大家带来的内容是关于 java中的多线程知识的总结分析,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

进程概述

  1. 进程:正在运行的程序,是系统进行资源分配和调用的独立单位。

  2. 进程就是一个程序在一个数据集上的一次动态执行过程。

  3. 进程一般由程序、数据集、进程控制块三部分组成。

  4. 每一个进程都有它自己的内存空间和系统资源。

  5. 我们编写的程序用来描述进程要完成哪些功能以及如何完成;

  6. 数据集则是程序在执行过程中所需要使用的资源;

  7. 进程控制块用来记录进程的外部特征,描述进程的执行变化过程,系统可以利用它来控制和管理进程,他是系统感知进程存在的唯一标识。

  8. 举例说明进程:

(1)想象一位有一手好厨艺的计算机科学家正在为他的女儿烘焙生日蛋糕;
(2)他有做生日蛋糕的食谱,厨房里有所需要的原料:面粉、鸡蛋、糖等。
(3)在这个比喻中,做蛋糕的食谱就是程序;
(4)计算机科学家就是处理器cpu;
(5)而做蛋糕的各种原料就是输入数据。
(6)进程就是厨师阅读食谱、取来各种原料、以及烘焙蛋糕等一系列动作的总和。
(7)现在假设计算机科学家的儿子哭着跑来出来,说他的头被一只蜜蜂蛰了;
(8)计算机科学家就记录下他照着食谱做到了哪儿了,也就是保存进程的当前状态;
(9)然后拿出一本急救手册,按照其中的指示处理蛰伤;
(10)这时我们就看到处理器从一个进程切换到另一个高优先级的进程;
(11)每个进程拥有各自的程序(食谱和急救手册);
(12)当蜜蜂蛰伤被处理完成之后,这位计算机科学家又回来做蛋糕;
(13)从他离开时的那一步继续进行下去。

线程概述

线程的出现是为了降低上下文切换的消耗,提高系统的并发性。

线程突破了一个进程只能干一件事的缺陷,使到进程内并发成为可能。

举例说明线程:

(1)假设一个文本程序,需要接收键盘输入,将内容显示在屏幕上,还需要保存信息到硬盘中。
(2)若只有一个进程,势必造成同一时间只能干一件事的尴尬,就是说当保存时,不能键盘输入;
(3)若有多个进程,每个进程负责一个任务;
(4)进程A负责键盘输入,进程B负责将内容显示在屏幕上,进程C负责保存内容到硬盘中;
(5)这里A、B、C间的协作涉及到了进程通信问题,而且它们有共同都需要的内容:文本内容;
(6)不停的切换会造成性能上的损失。
(7)若有一种机制,可以使A、B、C可以共享资源;
(8)这样上下文切换所需要保存和恢复的内容就少了;
(9)同时也可以减少通信所带来的性能损耗。
(10)这种机制,就是线程。

线程也叫轻量级进程。

它是一个基本的cpu执行单元,也是程序执行过程中的最小单元。

由线程id、程序计数器、寄存器集合和堆栈共同组成

线程的引入减小了程序并发执行时的开销,提高了操作系统的并发性能。

线程没有自己的系统资源。

进程与线程的关系

  1. 进程是计算机中的程序关于某数据集合上的一次运行活动。

  2. 进程是系统进行资源分配和调度的基本单位,是操作系统结构的基础

  3. 线程是进程的一个实体,是cpu调度和分派的基本单位

  4. 线程是比进程更小的能独立运行的基本单位

  5. 进程与线程的关系:

(1)一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程
(2)资源分配给进程,同一进程的所有线程共享该进程的所有资源
(3)cpu分给线程,即真正在cpu上运行的是线程

java程序运行原理

  1. java命令会启动java虚拟机,即启动JVM,等于启动了一个应用程序,也就是启动了一个进程;

  2. 该进程会自动启动一个主线程;

  3. 然后主线程去调用某个类的main方法。

  4. 所以main方法运行在主线程中,在此之前的所有程序都是单线程的

  5. jvm启动是多线程的:

(1)因为在jvm启动的时候垃圾回收线程也要启动,否则很容易会出现内存溢出;
(2)现在的垃圾回收线程加上前面的主线程,最少启动了两个线程,所以,jvm的启动是多线程的。

涉及到多线程的内容分成几部分:

  1. 扎好马步:线程的状态

  2. 内功心法:每个对象都有的方法(机制)

  3. 太祖长拳:基本线程类

  4. 九阴真经:高级多线程控制类

扎好马步:线程的状态(五种)

  1. New:新建状态,当线程对象创立后,即进入了新建状态,如:Thread t = new MyThread()

  2. Runnable:就绪状态,当调用线程对象的start()方法(t.start()),线程就进入就绪状态。处于就绪状态的线程,只是说明此线程已经做好了准备,随时等待cpu调度执行,并不是说执行了t.start()此线程立即就会执行

  3. Running:运行状态,当cpu开始调度处于就绪状态的线程时,此时线程才得以真正执行,即进入到运行状态。

  4. Blocked:阻塞状态,处于运行状态中的线程由于某种原因,暂时放弃对cpu的使用权,停止执行,此时进入阻塞状态,直到其进入到就绪状态,才有机会再次被cpu调用以进入到运行状态

  5. Dead:死亡状态,线程执行完了或者因异常退出了run()方法,该线程结束生命周期

  6. 注意:

    (1)就绪状态是进入到运行状态的唯一入口
    (2)线程想要进入到运行状态执行,首先必须处于就绪状态中
    (3)根据阻塞产生的原因,阻塞状态又可以分为三种:
       【1】等待阻塞:运行状态中的线程执行wait()方法,使本线程进入到等待阻塞状态
       【2】同步阻塞:线程在获取synchronized同步锁失败(因为锁被其他线程占用),它会进入同步阻塞状态
       【3】其他阻塞:通过调用线程的sleep()或join()或发出了I/O请求时,线程会进入到阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态

内功心法:每个对象都有的方法

synchronized、wait、notify是任何对象都具有的同步工具

monitor:

(1)是应用于同步问题的人工线程调度工具
(2)java的每个对象都有一个监视器,来监测并发代码的重入。
(3)在非多线程编码时该监视器不发挥作用,反之如果在synchronized范围内,监视器发挥作用

wait/notify:二者都必须存在于synchronized块中

并且这三个关键字针对的是同一个监视器,这意味着wait之后,其他线程可以进入同步块执行

太祖长拳:基本线程类

  1. Thread类

  2. Runnable类

  3. Callable类

九阴真经:高级多线程控制类

ThreadLocal类:

(1)用于保存线程的对立变量
(2)当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立的改变自己的副本,而不会影响其他线程所对应的副本。
(3)常用与用户登陆控制,如记录session信息。

原子类(AtomicInteger/AtomicBoolean)

Lock类:ReentrantLock/ReentrantReadWriteLock.ReadLock/ReentrantReadWriteLock.WriteLock


Atas ialah kandungan terperinci java中的多线程知识的总结分析. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Soalan Temuduga Java Spring Soalan Temuduga Java Spring Aug 30, 2024 pm 04:29 PM

Dalam artikel ini, kami telah menyimpan Soalan Temuduga Spring Java yang paling banyak ditanya dengan jawapan terperinci mereka. Supaya anda boleh memecahkan temuduga.

Cuti atau kembali dari Java 8 Stream Foreach? Cuti atau kembali dari Java 8 Stream Foreach? Feb 07, 2025 pm 12:09 PM

Java 8 memperkenalkan API Stream, menyediakan cara yang kuat dan ekspresif untuk memproses koleksi data. Walau bagaimanapun, soalan biasa apabila menggunakan aliran adalah: bagaimana untuk memecahkan atau kembali dari operasi foreach? Gelung tradisional membolehkan gangguan awal atau pulangan, tetapi kaedah Foreach Stream tidak menyokong secara langsung kaedah ini. Artikel ini akan menerangkan sebab -sebab dan meneroka kaedah alternatif untuk melaksanakan penamatan pramatang dalam sistem pemprosesan aliran. Bacaan Lanjut: Penambahbaikan API Java Stream Memahami aliran aliran Kaedah Foreach adalah operasi terminal yang melakukan satu operasi pada setiap elemen dalam aliran. Niat reka bentuknya adalah

TimeStamp to Date in Java TimeStamp to Date in Java Aug 30, 2024 pm 04:28 PM

Panduan untuk TimeStamp to Date di Java. Di sini kita juga membincangkan pengenalan dan cara menukar cap waktu kepada tarikh dalam java bersama-sama dengan contoh.

Program Java untuk mencari kelantangan kapsul Program Java untuk mencari kelantangan kapsul Feb 07, 2025 am 11:37 AM

Kapsul adalah angka geometri tiga dimensi, terdiri daripada silinder dan hemisfera di kedua-dua hujungnya. Jumlah kapsul boleh dikira dengan menambahkan isipadu silinder dan jumlah hemisfera di kedua -dua hujungnya. Tutorial ini akan membincangkan cara mengira jumlah kapsul yang diberikan dalam Java menggunakan kaedah yang berbeza. Formula volum kapsul Formula untuk jumlah kapsul adalah seperti berikut: Kelantangan kapsul = isipadu isipadu silinder Dua jumlah hemisfera dalam, R: Radius hemisfera. H: Ketinggian silinder (tidak termasuk hemisfera). Contoh 1 masukkan Jejari = 5 unit Ketinggian = 10 unit Output Jilid = 1570.8 Unit padu menjelaskan Kirakan kelantangan menggunakan formula: Kelantangan = π × r2 × h (4

PHP vs Python: Memahami Perbezaan PHP vs Python: Memahami Perbezaan Apr 11, 2025 am 12:15 AM

PHP dan Python masing -masing mempunyai kelebihan sendiri, dan pilihannya harus berdasarkan keperluan projek. 1.Php sesuai untuk pembangunan web, dengan sintaks mudah dan kecekapan pelaksanaan yang tinggi. 2. Python sesuai untuk sains data dan pembelajaran mesin, dengan sintaks ringkas dan perpustakaan yang kaya.

PHP: Bahasa utama untuk pembangunan web PHP: Bahasa utama untuk pembangunan web Apr 13, 2025 am 12:08 AM

PHP adalah bahasa skrip yang digunakan secara meluas di sisi pelayan, terutamanya sesuai untuk pembangunan web. 1.PHP boleh membenamkan HTML, memproses permintaan dan respons HTTP, dan menyokong pelbagai pangkalan data. 2.PHP digunakan untuk menjana kandungan web dinamik, data borang proses, pangkalan data akses, dan lain -lain, dengan sokongan komuniti yang kuat dan sumber sumber terbuka. 3. PHP adalah bahasa yang ditafsirkan, dan proses pelaksanaan termasuk analisis leksikal, analisis tatabahasa, penyusunan dan pelaksanaan. 4.Php boleh digabungkan dengan MySQL untuk aplikasi lanjutan seperti sistem pendaftaran pengguna. 5. Apabila debugging php, anda boleh menggunakan fungsi seperti error_reporting () dan var_dump (). 6. Mengoptimumkan kod PHP untuk menggunakan mekanisme caching, mengoptimumkan pertanyaan pangkalan data dan menggunakan fungsi terbina dalam. 7

Cipta Masa Depan: Pengaturcaraan Java untuk Pemula Mutlak Cipta Masa Depan: Pengaturcaraan Java untuk Pemula Mutlak Oct 13, 2024 pm 01:32 PM

Java ialah bahasa pengaturcaraan popular yang boleh dipelajari oleh pembangun pemula dan berpengalaman. Tutorial ini bermula dengan konsep asas dan diteruskan melalui topik lanjutan. Selepas memasang Kit Pembangunan Java, anda boleh berlatih pengaturcaraan dengan mencipta program "Hello, World!" Selepas anda memahami kod, gunakan gesaan arahan untuk menyusun dan menjalankan program, dan "Hello, World!" Pembelajaran Java memulakan perjalanan pengaturcaraan anda, dan apabila penguasaan anda semakin mendalam, anda boleh mencipta aplikasi yang lebih kompleks.

Bagaimana untuk menjalankan aplikasi boot musim bunga pertama anda di Spring Tool Suite? Bagaimana untuk menjalankan aplikasi boot musim bunga pertama anda di Spring Tool Suite? Feb 07, 2025 pm 12:11 PM

Spring Boot memudahkan penciptaan aplikasi Java yang mantap, berskala, dan siap pengeluaran, merevolusi pembangunan Java. Pendekatan "Konvensyen Lebih Konfigurasi", yang wujud pada ekosistem musim bunga, meminimumkan persediaan manual, Allo

See all articles