第1章
第一章中主要是起到过渡作用,大概介绍了Thread类中的一些常用API,是学习更深层次的基础,毕竟万丈高楼平地起嘛〜
学习完之后应该对下面的一些知识了熟与心,手到擒来。
- 线程的启动
- 线程的暂停
- 线程的停止
- 线程的优先级
- 线程的安全问题
1。
进程
进程是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源调度和分配的基本单位,是操作系统结构的基础。
线程
在进程中独立运行的子任务
创建线程的方式
- 继承Thread类,重写Run()方法。
- 实现Runnable接口。
常用API
- start() - 启动线程
- currentThread() - 获取当前线程
- isAlive() - 判断线程是否存活
- sleep() - 让当前执行的线程休眠(暂停执行)
- getId() - 获得线程的唯一标识
- stop() - 暴力停止线程
- interrupt() - 在当前线程中打了一个停止的标记
- 中断() - 测试当前线程是否中断,执行后将状态标志置清除为false,如果连续调用2此,则第二次为假
- isInterrupted() - 判断线程是否中断,不清除状态标志
- suspend() - 暂停线程
- resume() - 暂停线程
- setPriority() - 设置线程优先级,设置范围为1〜10;不在范围内的会抛出IllegalArgumentException异常
- yield() - 放弃当前的CPU资源,将它让给其他的任务去占用CPU执行时间,但是放弃时间不确定,可能马上放弃,又立刻获取。
注意:9 10都是过时的方法,他们使用时,容易造成对公共对象的锁独占,使其他对象无法访问公共对象,不推荐使用。
线程的特点
- 线程运行的时间是随机的,与start()顺序无关。
- 线程的优先级具有继承性。
- 优先级具有规则性:高优先级的线程总是大部分先执行完,但不代表高优先级的线程全部执行完.CPU尽量把资源让给优先级高的线程。
- 优先级具有随机性:优先级高的线程不一定每次都都先执行完。
解决非线程安全问题
- 添加同步。
- 共享数据:加上同步关键字使方法变成同步方法,同时会给线程加锁,变成“临界区/互斥区”,其他线程会不停的尝试拿到这把锁,直到拿到为止。
- 非线程安全:多个线程对同一个对象的同一个变量进行操作时出现值被更改,值不同步的情况,进而影响程序执行流程
当出现异和SOUT出现的异常情况,因为SOUT内部是同步的,进入SOUT线程前情况发送操作的,所以出现异常,添加同步解决
- sleep和wait()方法比较
属性 睡觉 等待() 来源 来自线程类 来自对象类 是否释放锁 否 是 使用范围 任何地方 只能在同步控制方法或者同步控制块里面使用 是否需要捕获异常 是 否 - 睡眠是线程的静态类方法,谁调用的谁去睡觉,即使在一个线程里调用了b的睡眠方法,实际上还是一个去睡觉,要让b线程睡觉要在b的代码中调用的睡眠。
- 睡眠不出让系统资源;等待是进入线程等待池等待,出让系统资源,其他线程可以占用CPU一般等待不会加时间限制,因为如果等待线程的运行资源不够,再出来也没用,要等待其他线程调用通知/ notifyAll的唤醒等待池中的所有线程,才会进入就绪队列等待OS分配系统资源。睡眠(毫秒)可以用时间指定使它自动唤醒过来,如果时间不到只能调用中断()强行打断。
- Thread.sleep代码(0)的作用是“触发操作系统立刻重新进行一次CPU竞争”。
- 睡眠必须捕获异常,而等待,通知和notifyAll的不需要捕获异常。
- 添加同步。