Java多线程(二)
1. synchronized关键字
利用此关键字可以定义同步方法或同步代码块,在同步代码块的操作里面只允许一个线程执行
A.利用同步代码块进行处理
synchronized(同步对象){
同步代码操作;
}
一般进行同步对象处理的时候可以采用当前 线程主体.class
B.利用同步方法进行处理:
只需要在方法上定义synchronized关键字即可
C. Lock接口解决线程同步问题:
void lock() 获得锁; void unlock() 释放锁
在同步代码前加锁lock(),执行完毕后释放锁unlock()
ReentrantLock类是Lock接口的子类
通过实例化ReentrantLock类调用 lock() 获得锁 void unlock() 释放锁
示例:
class X {
private final ReentrantLock lock = new ReentrantLock();
// ...
public void m() {
lock.lock(); // block until condition holds
try {
// ... method body
} finally {
lock.unlock()
}
}
}
注意事项: 1 继承Thread用静态(Static)锁 private static ReentrantLock lock = new ReentrantLock();
2 实现Runnable接口可以不用静态锁,当然用也没问题
2.线程优先级
线程优先级:
理论上讲线程优先级越高越有可能先执行(越有可能抢占到资源)
Thread类针对优先级的操作有如下方法:
设置优先级:public final void setPriority(int newPriority);
获取优先级:public final int getPriority();
在进行优先级定义的时候是通过int型数字来完成的,而对于此数字的选择在Thread类中定义有三个常量:
最高优先级:public static final int MAX_PRIORITY = 10;
中等优先级:public static final int NORM_PRIORITY = 5;
最低优先级:public static final int MIN_PRIORITY = 1;
3.线程守护
主线程的程序或其他线程还在执行的时候,守护线程将一直存在,并在后台运行
主线程执行完毕,守护线程就不再执行
设置为守护线程:public final void setDaemon(boolean on);
判断是否为守护线程:public final boolean isDaemon();
4. 线程等待与唤醒
等待与唤醒的操作机制主要依靠Object类提供的方法处理:
等待机制:
|-死等:public final void wait()throws InterruptedException;
|-设置等待时间:public final void wait(long timeout)throws InterruptedException;
|-设置等待时间:public final void wait(long timeout, int nanos)throws InterruptedException;
唤醒第一个等待的线程:public final void notify();
唤醒全部等待的线程:public final void notifyAll();
使用当前对象调用等待与唤醒方法