继承Thread类
run()
方法重写run()
方法的原因:
因为run()
是用来封装被线程执行的代码
run()
方法和strat()
方法的区别:
run()
:封装线程执行的代码,直接调用,相当于普通代码的调用
start()
:启动线程,然后由JVM调用此线程的run()
方法
Thread类中设置和获取线程名称的方法
void setName(String name)
:将此线程的名称更改为等于参数nameString getName()
:返回此线程的名称Thread(String name)
设置线程名称public static Thread currentThread()
:返回对当前正在执行的线程对象的引用线程有两种调度模型
Java使用的是抢占式调度模型
Thread类中设置和获取线程优先级的方法
public final int getPriority()
:返回此线程的优先级public final void setPriority(int newPriority)
:更改此线程的优先级方法名 | 说明 |
---|---|
static voidsleep(long millis) | 使当前正在执行的线程停留(暂停执行)指定的毫秒数 |
voidjoin() | 等待这个线程死亡 |
voidsetDaemon(boolean on) | 将此线程标记为守护线程,当运行的线程都是守护线程时,Java虚拟机将退出 |
run()
方法锁多条语句操作共享数据,可以使用同步代码块实现
格式:
synchronized(任意对象){
多条语句操作共享数据的代码
}
// synchronized(任意对象):相当于给代码加锁了,任意对象可以看成是一把锁
同步的好处和弊端
同步非静态方法:就是把 synchronized
关键字加到方法上
格式:
修饰符 synchronized 返回值类型 方法名(方法参数){ }
同步非静态方法的锁对象:this
同步静态方法:就是把 synchronized
关键字加到静态方法上
格式:
修饰符 static synchronized 返回值类型 方法名(方法参数){ }
同步静态方法的锁对象:类名.class
StringBuffer
Vector
Hashtable
Collections类也提供了多个静态方法实现List和Map的实现类的线程安全,例如:
方法名 | 说明 |
---|---|
static | 返回由指定集合支持的同步(线程安全)集合。 |
static | 返回由指定列表支持的同步(线程安全)列表。 |
static <K,V> Map<K,V>synchronizedMap( Map<K,V> c) | 返回由指定地图支持的同步(线程安全)映射。 |
Lock实现提供比使用synchronized方法和语句可以获得更广泛的锁定操作
Lock中提供了获得锁和释放锁的方法
void lock()
:获得锁void unlock()
:释放锁Lock是接口,可以采用它的实现类ReentrantLock来实例化
ReentrantLock的构造方法
ReentrantLock():创建一个ReentrantLock的实例
为了体现生产和消费过程中的等待和唤醒,Java提供了几个方法在Object类中
Object类的等待和唤醒方法:
方法名 | 说明 |
---|---|
voidwait() | 导致当前线程等待,直到另一个线程调用该对象的notify() 方法或notifyAll() 方法 |
voidnotify() | 唤醒正在等待对象监视器的单个线程 |
voidnotifyAll() | 唤醒正在等待对象监视器的所有线程 |