Java多线程编程核心技术--第一章

第1章

第一章中主要是起到过渡作用,大概介绍了Thread类中的一些常用API,是学习更深层次的基础,毕竟万丈高楼平地起嘛〜
学习完之后应该对下面的一些知识了熟与心,手到擒来。
- 线程的启动
- 线程的暂停
- 线程的停止
- 线程的优先级
- 线程的安全问题


1。

  • 进程

    进程是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源调度和分配的基本单位,是操作系统结构的基础。

  • 线程

    在进程中独立运行的子任务

  • 创建线程的方式

    1. 继承Thread类,重写Run()方法。
    2. 实现Runnable接口。
  • 常用API

    1. start() - 启动线程
    2. currentThread() - 获取当前线程
    3. isAlive() - 判断线程是否存活
    4. sleep() - 让当前执行的线程休眠(暂停执行)
    5. getId() - 获得线程的唯一标识
    6. stop() - 暴力停止线程
    7. interrupt() - 在当前线程中打了一个停止的标记
    8. 中断() - 测试当前线程是否中断,执行后将状态标志置清除为false,如果连续调用2此,则第二次为假
    9. isInterrupted() - 判断线程是否中断,不清除状态标志
    10. suspend() - 暂停线程
    11. resume() - 暂停线程
    12. setPriority() - 设置线程优先级,设置范围为1〜10;不在范围内的会抛出IllegalArgumentException异常
    13. yield() - 放弃当前的CPU资源,将它让给其他的任务去占用CPU执行时间,但是放弃时间不确定,可能马上放弃,又立刻获取。

    注意:9 10都是过时的方法,他们使用时,容易造成对公共对象的锁独占,使其他对象无法访问公共对象,不推荐使用。

  • 线程的特点

    1. 线程运行的时间是随机的,与start()顺序无关。
    2. 线程的优先级具有继承性。
    3. 优先级具有规则性:高优先级的线程总是大部分先执行完,但不代表高优先级的线程全部执行完.CPU尽量把资源让给优先级高的线程。
    4. 优先级具有随机性:优先级高的线程不一定每次都都先执行完。
  • 解决非线程安全问题

    1. 添加同步。
      1. 共享数据:加上同步关键字使方法变成同步方法,同时会给线程加锁,变成“临界区/互斥区”,其他线程会不停的尝试拿到这把锁,直到拿到为止。
    2. 非线程安全:多个线程对同一个对象的同一个变量进行操作时出现值被更改,值不同步的情况,进而影响程序执行流程
    3. 当出现异和SOUT出现的异常情况,因为SOUT内部是同步的,进入SOUT线程前情况发送操作的,所以出现异常,添加同步解决

      • sleep和wait()方法比较
    属性 睡觉 等待()
    来源 来自线程类 来自对象类
    是否释放锁
    使用范围 任何地方 只能在同步控制方法或者同步控制块里面使用
    是否需要捕获异常
    • 睡眠是线程的静态类方法,谁调用的谁去睡觉,即使在一个线程里调用了b的睡眠方法,实际上还是一个去睡觉,要让b线程睡觉要在b的代码中调用的睡眠。
    • 睡眠不出让系统资源;等待是进入线程等待池等待,出让系统资源,其他线程可以占用CPU一般等待不会加时间限制,因为如果等待线程的运行资源不够,再出来也没用,要等待其他线程调用通知/ notifyAll的唤醒等待池中的所有线程,才会进入就绪队列等待OS分配系统资源。睡眠(毫秒)可以用时间指定使它自动唤醒过来,如果时间不到只能调用中断()强行打断。
    • Thread.sleep代码(0)的作用是“触发操作系统立刻重新进行一次CPU竞争”。
    • 睡眠必须捕获异常,而等待,通知和notifyAll的不需要捕获异常。

猜你喜欢

转载自blog.csdn.net/ouzhuangzhuang/article/details/80607807