28a 线程&进程基础-快速上手

简介: 使用Java的Thread类来创建和管理程。线程的生命周期包括五个状态:新建、就绪、运行、阻塞和死步与互斥: 当多个程共享同一资源时,性Java提供了synchronized关. 线程安全的概念和正确的执行,不会出现数据竞争和错误情况发生。Java提供类概锁造成的一种阻塞状态。方法来避免死锁的发生程的工具类: Java提供了一些并发编的工具类,比如Semaphore、CountDownLatch、CyclicBarrier等来实现程之间的协作和控制概是,当有任务需要处理时接从线程池中取出线程使用,可以优化线程创建和销毁过程,减7. 分析线程和并在开发过程中,我们需要使用一些工具和方法来分析和解

使用Java的Thread类来创建和管理程。线程的生命周期包括五个状态:新建、就绪、运行、阻塞和死步与互斥: 当多个程共享同一资源时,性Java提供了synchronized关. 线程安全的概念和正确的执行,不会出现数据竞争和错误情况发生。Java提供类概锁造成的一种阻塞状态。方法来避免死锁的发生程的工具类: Java提供了一些并发编的工具类,比如Semaphore、CountDownLatch、CyclicBarrier等来实现程之间的协作和控制概是,当有任务需要处理时接从线程池中取出线程使用,可以优化线程创建和销毁过程,减7. 分析线程和并在开发过程中,我们需要使用一些工具和方法来分析和解决线程和发问题,比如线程 Dump、JVMTI、JConsole等


思维导图


7.jpg


1 线程的使用


1.1 创建线程


创建线程可以通过两种方式,①继承Thread类重写run方法;②实现Runnable接口,重写run方法

**两种方式的异同点:**①实现Runnable接口更适合资源共享,一个资源被多个线程调用(建议使用Runnable)

(1)继承Thread类,重写run方法

查看Thread类图【打开方式:选中类名右键,选择diagrams**】**

8.png

① 当一个类继承了Thread类,则该类就可以当线程使用

② 当一个类继承了Thread类,需要重写run方法

③ 开启线程方法和休眠方法

public class Cat extends Thread{
    @Override
    public void run() {
//        需求:每隔1秒输出一句话
//        让线程休眠1秒钟
        int flag = 0;
       while (flag <8){
           try {
               Thread.sleep(1000);
               System.out.println("登峰造极!"+(flag+1)+" 线程名:"+Thread.currentThread().getName());
               flag++;
           } catch (InterruptedException e) {
               throw new RuntimeException(e);
           }
       }
    }
}
public static void main(String[] args) {
        Cat cat = new Cat();
        cat.start();//启动线程
//        执行主线程程其他逻辑
        for (int i = 0; i < 6; i++) {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            System.out.println("我是主线程"+i+" 线程名:"+Thread.currentThread().getName());
        }
    }

9.jpg

(2)实现Runnable接口,重写run方法

① 当一个类实现了Runnable接口,则该类就可以当线程使用

② 需要重写run方法

③ 需要使用代理模式将实现了Runnable接口的类对象,传给Thread,通过Tread对象调用star方法启动线程

public class Dog implements Runnable{
    public void run() {
//        需求:每隔1秒输出一句话
//        让线程休眠1秒钟
        int flag = 0;
        while (flag <8){
            try {
                Thread.sleep(1000);
                System.out.println("登峰造极!"+(flag+1)+" 线程名:"+Thread.currentThread().getName());
                flag++;
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }
    }
}
public static void main(String[] args) {
//    ①    通过继承Thread类,启动线程
        Cat cat = new Cat();
        cat.start();//启动线程
//     ②   通过实现Runnable接口,启动线程
        Dog dog = new Dog();
        Thread thread = new Thread(dog);
        thread.start();
//        执行主线程程其他逻辑
        for (int i = 0; i < 6; i++) {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            System.out.println("我是主线程"+i+" 线程名:"+Thread.currentThread().getName());
        }
    }


1.2 多线程的同步和互斥


(1)线程终止

子线程中设置一个变量,通过变量控制run方法的运行,主线程中修改子线程的变量从而达到控制线程终止的效果;

(2)线程同步机制

在多线程编程中,一些敏感数据不允许被多个线程同时访问,此时就可以使用同步访问技术,保证数据在任何时间最多有一个线程访问;保证数据的完整性

①java语音中,引入了对象互斥锁的概念,来保证共享数据的操作的完整性

②每个对象都对应一个可称为"互斥锁"的标记,这个标记用来保证在任意时刻,只能有一个线程访问该对象

③关键字synchronized与对象互斥锁联系,当某个对象用synchronized修饰时,表明该对象在任意时刻只能由一个线程访问

④同步锁局限性:导致程序执行效率降低

⑤同步方法(非静态)的锁可以是this,也可以是其他对象要求是同一个对象

⑥同步方法(静态)的锁为当前本身

1.同步实现方法:Synchronized

   1.同步代码块

synchronized(对象){
    // 得到对象的锁才能操作,同步代码
  // 需要同步的代码
}
sycchronized还可以房租方法声明中,表示整个方法-为同步方法
public synchronized void method(){
    // 需要同步的代码
}

(3)线程的死锁

(4)释放锁

释放锁的4种情况

:::warning

1 当线程的同步方法,同步代码块执行结束

2 当线程在同步代码块,同步方法中遇到break,return

3 当线程在同步代码块、同步方法中出现了为处理的Error或Exception导致异常结束

4 当线程在同步代码块、同步方法中执行了线程对象的wait方法,当前线程暂停比并释放锁

:::

不会释放锁的情况

:::info

1 线程在调用同步代码块或者同步方法时,程序调用Thread.sleep(),Thread.yield()方法暂停当前线程执行,不会释放锁

2 线程执行同步代码块时,其他线程调用了该线程的suspend()方法将该线程挂起,该线程不会释放锁

:::


1.3 线程常用的方法


方法名 说明 备注

setName 设置线程名称

getName 返回线程名称

star 该线程开始执行,java虚拟机底层调用该线程的star0方法

run 调用线程对象,run方法

setPriority 更改线程优先级

getPriority 获取线程优先级

sleep 指定毫秒数,让当前线程休眠

interrupt 中断线程

yield 线程的礼让,让出cpu,让其他线程执行,但时间不确定;

join 线程插队,插队的线程一旦插队成功,则肯定先执行完插入的线程所有任务


1.4 用户线程和守护线程


用户线程:也叫工作线程

**守护线程:**一般是为工作线程服务的,当用户线程结束,守护线程自动结束;

常见的守护线程的机制:垃圾回收机制

(1)创建守护线程

 

Small small = new Small();
        //        设置线程为守护线程
        small.setDaemon(true);


1.5 线程的生命周期


11.png

目录
相关文章
|
15天前
|
调度 开发者 Python
深入浅出操作系统:进程与线程的奥秘
在数字世界的底层,操作系统扮演着不可或缺的角色。它如同一位高效的管家,协调和控制着计算机硬件与软件资源。本文将拨开迷雾,深入探索操作系统中两个核心概念——进程与线程。我们将从它们的诞生谈起,逐步剖析它们的本质、区别以及如何影响我们日常使用的应用程序性能。通过简单的比喻,我们将理解这些看似抽象的概念,并学会如何在编程实践中高效利用进程与线程。准备好跟随我一起,揭开操作系统的神秘面纱,让我们的代码运行得更加流畅吧!
|
15天前
|
消息中间件 Unix Linux
【C语言】进程和线程详解
在现代操作系统中,进程和线程是实现并发执行的两种主要方式。理解它们的区别和各自的应用场景对于编写高效的并发程序至关重要。
45 6
|
16天前
|
调度 开发者
深入理解:进程与线程的本质差异
在操作系统和计算机编程领域,进程和线程是两个核心概念。它们在程序执行和资源管理中扮演着至关重要的角色。本文将深入探讨进程与线程的区别,并分析它们在现代软件开发中的应用和重要性。
40 5
|
14天前
|
算法 调度 开发者
深入理解操作系统:进程与线程的管理
在数字世界的复杂编织中,操作系统如同一位精明的指挥家,协调着每一个音符的奏响。本篇文章将带领读者穿越操作系统的幕后,探索进程与线程管理的奥秘。从进程的诞生到线程的舞蹈,我们将一起见证这场微观世界的华丽变奏。通过深入浅出的解释和生动的比喻,本文旨在揭示操作系统如何高效地处理多任务,确保系统的稳定性和效率。让我们一起跟随代码的步伐,走进操作系统的内心世界。
|
16天前
|
调度 开发者
核心概念解析:进程与线程的对比分析
在操作系统和计算机编程领域,进程和线程是两个基本而核心的概念。它们是程序执行和资源管理的基础,但它们之间存在显著的差异。本文将深入探讨进程与线程的区别,并分析它们在现代软件开发中的应用和重要性。
34 4
|
1月前
|
并行计算 数据处理 调度
Python中的并发编程:探索多线程与多进程的奥秘####
本文深入探讨了Python中并发编程的两种主要方式——多线程与多进程,通过对比分析它们的工作原理、适用场景及性能差异,揭示了在不同应用需求下如何合理选择并发模型。文章首先简述了并发编程的基本概念,随后详细阐述了Python中多线程与多进程的实现机制,包括GIL(全局解释器锁)对多线程的影响以及多进程的独立内存空间特性。最后,通过实例演示了如何在Python项目中有效利用多线程和多进程提升程序性能。 ####
|
1月前
|
Linux 调度 C语言
深入理解操作系统:进程和线程的管理
【10月更文挑战第32天】本文旨在通过浅显易懂的语言和实际代码示例,带领读者探索操作系统中进程与线程的奥秘。我们将从基础知识出发,逐步深入到它们在操作系统中的实现和管理机制,最终通过实践加深对这一核心概念的理解。无论你是编程新手还是希望复习相关知识的资深开发者,这篇文章都将为你提供有价值的见解。
|
1月前
|
Java
java小知识—进程和线程
进程 进程是程序的一次执行过程,是系统运行的基本单位,因此进程是动态的。系统运行一个程序即是一个进程从创建,运行到消亡的过程。简单来说,一个进程就是一个执行中的程序,它在计算机中一个指令接着一个指令地执行着,同时,每个进程还占有某些系统资源如CPU时间,内存空间,文件,文件,输入输出设备的使用权等等。换句话说,当程序在执行时,将会被操作系统载入内存中。 线程 线程,与进程相似,但线程是一个比进程更小的执行单位。一个进程在其执行的过程中产生多个线程。与进程不同的是同类的多个线程共享同一块内存空间和一组系统资源,所以系统在产生一个线程,或是在各个线程之间做切换工作时,负担要比
28 1
|
1月前
深入理解操作系统:进程与线程的管理
【10月更文挑战第30天】操作系统是计算机系统的核心,它负责管理计算机硬件资源,为应用程序提供基础服务。本文将深入探讨操作系统中进程和线程的概念、区别以及它们在资源管理中的作用。通过本文的学习,读者将能够更好地理解操作系统的工作原理,并掌握进程和线程的管理技巧。
44 2
|
26天前
|
监控 JavaScript 前端开发
python中的线程和进程(一文带你了解)
欢迎来到瑞雨溪的博客,这里是一位热爱JavaScript和Vue的大一学生分享技术心得的地方。如果你从我的文章中有所收获,欢迎关注我,我将持续更新更多优质内容,你的支持是我前进的动力!🎉🎉🎉
21 0