java 22 - 3 多线程的概述以及其它所涉及的东西(看)

1:要想了解多线程,必须先了解线程,而要想了解线程,必须先了解进程,因为线程是依赖于进程而存在。

2:什么是进程?
  通过任务管理器我们就看到了进程的存在。
  而通过观察,就可以发现只有运行的程序才会出现进程。
  进程:就是正在运行的程序。
  进程是系统进行资源分配和调用的独立单位。每一个进程都有它自己的内存空间和系统资源。

3:多进程有什么意义呢?
  单进程的计算机只能做一件事情,而我们现在的计算机都可以做多件事情。
  举例:一边玩游戏(游戏进程),一边听音乐(音乐进程)。
  也就是说现在的计算机都是支持多进程的,可以在一个时间段内执行多个任务。
  并且呢,可以提高CPU的使用率。

问题:
  一边玩游戏,一边听音乐是同时进行的吗?
  不是。因为单CPU在某一个时间点上只能做一件事情。
  而我们在玩游戏,或者听音乐的时候,是CPU在做着程序间的高效切换让我们觉得是同时进行的。

4:什么是线程呢?
  在同一个进程内又可以执行多个任务,而这每一个任务我就可以看出是一个线程。
  线程:是程序的执行单元,执行路径。是程序使用CPU的最基本单位。
  单线程:如果程序只有一条执行路径。
  多线程:如果程序有多条执行路径。

5:多线程有什么意义呢?
  不是提高程序的执行速度。其实是为了提高应用程序的使用率。
  程序的执行其实都是在抢CPU的资源,CPU的执行权。
  多个进程是在抢这个资源,而其中的某一个进程如果执行路径比较多,就会有更高的几率抢到CPU的执行权。
  我们是不敢保证哪一个线程能够在哪个时刻抢到,所以线程的执行有随机性。

进程:
  正在运行的程序,是系统进行资源分配和调用的独立单位。
  每一个进程都有它自己的内存空间和系统资源。
线程:
  是进程中的单个顺序控制流,是一条执行路径
  一个进程如果只有一条执行路径,则称为单线程程序。
  一个进程如果有多条执行路径,则称为多线程程序。

举例:
  扫雷程序,迅雷下载

大家注意两个词汇的区别:并行和并发。
  前者是逻辑上同时发生,指在某一个时间内同时运行多个程序。
  后者是物理上同时发生,指在某一个时间点同时运行多个程序。

Java程序的运行原理:
  

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

该进程会自动启动一个 “主线程” ,然后主线程去调用某个类的 main 方法。

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

思考题:
  jvm虚拟机的启动是单线程的还是多线程的?
  多线程的。
  原因是垃圾回收线程也要先启动,否则很容易会出现内存溢出。
  现在的垃圾回收线程加上前面的主线程,最低启动了两个线程,所以,jvm的启动其实是多线程的。

时间: 2024-10-07 06:13:52

java 22 - 3 多线程的概述以及其它所涉及的东西(看)的相关文章

java 22 - 7 多线程之控制线程的方法

线程休眠(让线程休息一会再运行) public static void sleep(long millis) 在自定义线程类中添加该方法. 更改后,运行测试类,结果就是每执行完一轮,就休息1秒(这里设置的是休眠1秒),再进行一轮. 一轮:(如果测试类调用了3个线程,那么就是随机运行3次为一轮) 如: 哈士奇:1,日期:Wed Oct 05 21:01:19 CST 2016 短尾猫:1,日期:Wed Oct 05 21:01:19 CST 2016 萨摩耶:1,日期:Wed Oct 05 21:

java 22 - 12 多线程之解决线程安全问题的实现方式1

从上一章知道了多线程存在着线程安全问题,那么,如何解决线程安全问题呢? 导致出现问题的原因: A:是否是多线程环境 B:是否有共享数据 C:是否有多条语句操作共享数据 上一章的程序,上面那3条都具备,所以肯定出问题. 如何解决问题: 原因A.B肯定不能改变,所以只能改变原因C 解决问题思路: 如果把多条语句操作共享数据的代码给包成一个整体,让某个线程在执行这个整体的时候,别的线程不能执行. 这时候就用到了java提供的:同步机制 同步代码块: synchronized(对象){  需要同步的代码

java 22 - 9 多线程之 代码实现的方式2

多线程的代码实现: 方式2:实现Runnable接口 步骤: A:自定义类MyRunnable实现Runnable接口 B:重写run()方法 C:创建MyRunnable类的对象 D:创建Thread类的对象,并把C步骤的对象作为构造参数传递(2种方法) a:Thread(Runnable target) b:Thread(Runnable target, String name) 方式2的好处: A:因为java的继承方式是单继承,方式2可以避免java单继承带来的局限性 B:适合多个相同的

java 22 - 6 多线程之线程调度和设置线程的优先级

线程调度 假如我们的计算机只有一个 CPU,那么 CPU 在某一个时刻只能执行一条指令,线程只有得到 CPU时间片,也就是使用权,才可以执行指令. 那么Java是如何对线程进行调用的呢? 线程有两种调度模型: 分时调度模型 所有线程轮流使用 CPU 的使用权,平均分配每个线程占用 CPU 的时间片 抢占式调度模型 优先让优先级高的线程使用 CPU,如果线程的优先级相同,那么会随机选择一个,优先级高的线程获取的 CPU 时间片相对多一些. Java使用的是抢占式调度模型. 既然线程设有设置优先级,

java 22 - 5 多线程之获取和设置线程对象的名称

如何获取线程对象的名称呢? public final String getName():获取线程的名称.如何设置线程对象的名称呢? public final void setName(String name):设置线程的名称针对不是Thread类的子类中如何获取线程对象名称呢? public static Thread currentThread():返回当前正在执行的线程对象 Thread.currentThread().getName() public final String getNam

java 22 - 4 多线程的代码实现的方式1

需求:我们要实现多线程的程序. 如何实现呢? 由于线程是依赖进程而存在的,所以我们应该先创建一个进程出来. 而进程是由系统创建的,所以我们应该去调用系统功能创建一个进程. Java是不能直接调用系统功能的,所以,我们没有办法直接实现多线程程序. 但是,Java可以去调用C/C++写好的程序来实现多线程程序.  由C/C++去调用系统功能创建进程,然后由Java去调用这样的东西, 然后提供一些类供我们使用.我们就可以实现多线程程序了.那么Java提供的类是什么呢?Thread类通过查看API,我们

java 22 - 18 多线程之 线程的状态转换、线程组

线程的状态转换图解:..博客暂时不能上传图片 线程的线程组: 线程组: 把多个线程组合到一起.    它可以对一批线程进行分类管理,Java允许程序直接对线程组进行控制. 首先创建一个Runnable的实现类 public class MyRunnable implements Runnable { public void run() { for(int x = 0; x < 10 ; x++){ System.out.println(x); } } } 先看看默认状态下,线程都会保存在哪个线程

java 22 - 17 多线程之等待唤醒机制(接16)

先来一张图,看看什么叫做等待唤醒机制 接上一章的例子. 例子:学生信息的录入和获取 * 资源类:Student  * 设置学生数据:SetThread(生产者) * 获取学生数据:GetThread(消费者) * 测试类:StudentDemo * 资源类:Student (为了使用等待唤醒机制,添加了个布尔类型的变量,默认为flase) 1 public class Student { 2 String name; 3 int age; 4 boolean flag; // 默认情况是没有数据

java 22 - 16 多线程之生产者和消费者的问题

生产者和消费者问题的描述图 通过上图,我们可以发现: 生产者和消费者使用的都是同一个资源(肉包子) 所以,当使用线程的时候,这两类的锁也是同一把锁(为了避免出现线程安全问题) 例子:学生信息的录入和获取 * 资源类:Student * 设置学生数据:SetThread(生产者) * 获取学生数据:GetThread(消费者) * 测试类:StudentDemo * 资源类:Student 1 public class Student { 2 3 String name; 4 int age; 5