谈谈多线程和进程,附上例题讲解 2

简介: 谈谈多线程和进程,附上例题讲解

5. Thread和Runnable的区别和联系

1、Thread是一个类,Runnable是一个接口
2、Thread类实现了Runnable接口,重写了run方法
3、Runnable是一个接口,定义一个类实现接口的同时还可以继承其他类;

4、Runnable适合多个相同的程序代码的线程去处理同一个资源,代码可以被多个线程共享

6. 线程生命周期(必须要会描述)


新线程:当我们使用new关键字创建线程对象实例,那这个适合它只是作为一个对象存在,JVM没有为他分配CPU资源,


就绪状态:处于创建中的线程调用start方法将线程的状态转化为就绪状态,当前状态已经得到了其他的系统资源,在等待CPU资源


运行状态:就绪状态得到CPU资源后进入运行状态,执行run【call】方法中的代码段


等待/阻塞:线程运行的过程中被剥夺资源或则和我们在等待某些事件,这个就进入等待/阻塞状态,如supend()、sleep()被调用,或者线程使用wait()方法来等待条件变量,这个适合线程会释放所有的资源,但是并不释放锁,所以很容易引起死锁知道程序调用resume()方法回复线程运行。等待事件结束后或者得足够的资源就进入就绪态


死亡状态:当线程运行结束【正常结束】由JVM收回线程所占的资源

6 线程数据共享

练习:
要有5个售票点,用同一份数据,数据保持一致100张
使用Thread和Runnable两种方式完成

Synchronized

以上代码表示,当我们某个线程在使用这个方法的时候,其他线程无法使用当前方法,相当于给这个方法上了一个锁

join方法

Join用法

如上使用join()不传参时我们会先执行调用join的线程,只有在join的线程执行完了之后才会执行其他线程

如果join方法后面有传参,那么表示我们其他线程需要等待当前线程XX毫米,在等待完这个时长之后,其他线程就会开始执行

如上所示,join如果在start的前面将会失效,此时线程还未启动,此时使用join就不会有任何效果

t1调用了join方法,如果t1在规定的等待时间之前就完成了线程的运行,那么我们的其他线程就可以不用继续等待,可以直接进行线程的运行

7.线程同步和通信

创建一个用户类需要有名字,性别,还有showPerson方法(展示用户信息)、setPerson方法(将存入的用户信息替换)


创建一个线程类,修改用户信息。死循环一直去修改用户信息,如果是奇数就存一个对象,如果是偶数就存另一个对象


创建第二个线程类。一直去循环输出用户的信息,。

创建一个测试类。执行我们的两个线程

package com.etc.person;
//用户类
public class Person {
  private String name;
  private String sex;
  public Person() {
    super();
  }
  public Person(String name, String sex) {
    super();
    this.name = name;
    this.sex = sex;
  }
  /**
   * 获取对象信息
   */
  public void showPerson() {
    System.out.println(this.name+","+this.sex);
  }
  public void setPerson(String name,String sex) {
    this.name = name;
    this.sex = sex;
  }
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
  public String getSex() {
    return sex;
  }
  public void setSex(String sex) {
    this.sex = sex;
  }
}
package com.etc.person;
import java.util.Random;
public class ModifyPerson implements Runnable{
  private Person person;
  private int n;
  public ModifyPerson(Person person) {
    super();
    this.person = person;
  }
  @Override
  public void run() {
    while(true) {
      //随机数去实例不同的用户去赋值
      n=new Random().nextInt(100);
      if(n%2==0) {
        person.setPerson("A", "男");
      }else {
        person.setPerson("B", "女");
      }
    }
  }
}
package com.etc.person;
public class ShowPerson implements Runnable{
  private Person person;
  public ShowPerson(Person person) {
    super();
    this.person = person;
  }
  @Override
  public void run() {
    while(true) {
      person.showPerson();
    }
  }
}
package com.etc.person;
public class Test {
  public static void main(String[] args) {
    //创建Person对象
    Person person=new Person();
    //修改线程对象
    ModifyPerson md=new ModifyPerson(person);
    //显示用户信息线程对象
    ShowPerson sp=new ShowPerson(person);
    Thread th1=new Thread(md);
    th1.start();
    new Thread(sp).start();
  }
}

老铁,如果确实对你有帮助请点个免费的赞鼓励一下

白嫖不好,创作不易。各位的点赞就是我创作的最大动力,如果我有哪里写的不对,欢迎评论区留言进行指正,我们下篇文章见!


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