进程和线程
进程:是正在进行的程序,是系统进行资源分配和调用的独立单元,每一个进程都有它自己的内存空间和系统资源
线程:
单线程:一个进程如果只有一条执行路径,则称为单线程程序
多线程:一个程序如果有多条执行路径,则称为多线程程序
多线程的实现方式
继承Thread类,重写run方法
设置和获取线程名称
setName(String name) 设置此线程的名称
getName() 返回此线程的名称
Thread.currentThread().getName() 返回正在运行线程的名称
线程优先级
getPriority() 返回此线程的优先级
setPriority(int newPriority) 更改此线程的优先级 默认值5 最小值1 最大值10
线程优先级高仅仅表示线程获取的CPU时间片的几率高,并不是优先级高一定会抢到CPU的执行权
线程控制退出
static void sleep(long millis) 使当前正在执行的线程停留(暂停执行)指定的毫秒数
void join() 等到这个线程死亡(执行结束)
void setDaemom(boolean on) 将此线程标记为守护线程,当运行的线程都是守护线程时,JAVA虚拟机将退出
实现Runnable接口,重写run方法
操作方法与上同
相比继承Thread类,实现Runnable接口的好处
1 避免了JAVA单继承的局限性
2 适合多个相同程序的代码去处理同一个资源的情况,把线程和程序的代码、数据有效分离,较好的体现了面向对象的设计思想
线程同步:
判断多线程程序是否会有数据安全问题的标准
1 是否是多线程环境
2 是否有共享数据
3 是否有多条语句操作共享数据
如何解决数据安全问题?
把多少语句操作共享数据的代码给锁起来,让任意时刻只能有一个线程执行即可
同步代码块
格式:
synchronized(任意对象){
多条语句操作共享数据的代码
}
synchronized(任意对象):就相当于给代码加锁了,任意对象就可以看成是一把锁,操作锁对象的时候应注意是同一把锁
好处和弊端
好处:解决了多线程的数据安全问题
弊端:当线程很多时,因为每个线程都会去判断同步上的锁,这是很耗费资源的,无形中会降低程序的运行效率
同步方法
格式:
修饰符 synchronized 返回值类型 方法名(方法参数){ }
同步方法的锁对象是什么呢?
this
同步静态方法:就是把synchronized关键字加到静态方法上
格式:
修饰符 static synchronized 返回值类型 方法名(方法参数){ }
同步静态方法的锁对象是什么呢?
类名.class
线程安全的类
StringBuffer
与StringBuilder对应,StringBuffer是线程安全的,要执行同步,效率低。StringBuilder是线程不安全的,不会执行同步,效率高
Vector
与List对应,Vector是线程安全的,要执行同步,效率低。List是线程不安全的,不会执行同步,效率高
Hashtable
与HashMap对应,Hashtable是线程安全的,要执行同步,效率低。HashMap是线程不安全的,不会执行同步,效率高
Lock锁
Lock实现提供比使用synchronized方法和语句可以获得更广泛的锁定操作
void lock() 获得锁
void unlock() 释放锁
Lock接口不能直接实例化
线程等待和唤醒
Object类的等待和唤醒方法:
wait() 导致当前线程等待
notify() 唤醒正在等待对象监视器的单个线程
notifyAll() 唤醒正在等待对象监视器的所有线程 |
|