• 什么是多线程 多进程


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

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

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

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

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

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

    6:多线程(理解)
    (1)多线程:一个应用程序有多条执行路径
    进程:正在执行的应用程序
    线程:进程的执行单元,执行路径
    单线程:一个应用程序只有一条执行路径
    多线程:一个应用程序有多条执行路径

    多进程的意义?
    提高CPU的使用率
    多线程的意义?
    提高应用程序的使用率
    (2)Java程序的运行原理及JVM的启动是多线程的吗?
    A:Java命令去启动JVM,JVM会启动一个进程,该进程会启动一个主线程。
    B:JVM的启动是多线程的,因为它最低有两个线程启动了,主线程和垃圾回收线程。
    (3)多线程的实现方案(自己补齐步骤及代码 掌握)
    A:继承Thread类
    B:实现Runnable接口
    (4)线程的调度和优先级问题
    A:线程的调度
    a:分时调度
    b:抢占式调度 (Java采用的是该调度方式)
    B:获取和设置线程优先级
    a:默认是5
    b:范围是1-10
    (5)线程的控制(常见方法)
    A:休眠线程
    B:加入线程
    C:礼让线程
    D:后台线程
    E:终止线程(掌握)
    (6)线程的生命周期(参照 线程生命周期图解.bmp)
    A:新建
    B:就绪
    C:运行
    D:阻塞
    E:死亡
    (7)电影院卖票程序的实现
    A:继承Thread类
    B:实现Runnable接口
    (8)电影院卖票程序出问题
    A:为了更符合真实的场景,加入了休眠100毫秒。
    B:卖票问题
    a:同票多次
    b:负数票
    (9)多线程安全问题的原因(也是我们以后判断一个程序是否有线程安全问题的依据)
    A:是否有多线程环境
    B:是否有共享数据
    C:是否有多条语句操作共享数据
    (10)同步解决线程安全问题
    A:同步代码块
    synchronized(对象) {
    需要被同步的代码;
    }

    这里的锁对象可以是任意对象。

    B:同步方法
    把同步加在方法上。

    这里的锁对象是this

    C:静态同步方法
    把同步加在方法上。

    这里的锁对象是当前类的字节码文件对象(反射再讲字节码文件对象)
    (11)回顾以前的线程安全的类
    A:StringBuffer
    B:Vector
    C:Hashtable
    D:如何把一个线程不安全的集合类变成一个线程安全的集合类
    用Collections工具类的方法即可。

  • 相关阅读:
    EF基于方法的查询语法
    &,^,|,的简化计算与理解
    会计中阿拉伯数字变数字繁体大写
    接口对接请求方法
    经验总结之Android framework开发
    android开机过程简单描述
    为什么一个类的全局变量默认以m开头?
    使用DataOutputStream写入int类型数字不能显示
    20151128学习总结
    sky简介
  • 原文地址:https://www.cnblogs.com/shann/p/6854764.html
Copyright © 2020-2023  润新知