多线程创建方法
- 继承Thread类,但是受限于单继承
- 实现Runnable接口,是最常用的方法
- 实现Callble接口,可以从
run
方法中返回值
线程的中断机制
由于线程的stop
方法已经不推荐使用了,因此可以采用中断的方法。其基本思路为在外部设置线程的中断状态,从内部判断何时中断。如下代码所示:
//Main.class
Thread t1 = new Thread(new MyThread());
t1.start();
if(some condition){
t1.interrupt();
}
//MyThread.class
public void run(){
if(Thread.currentThread().isInterrupted()){
break;
}
}
隐式锁(synchronized)
synchronized
有两种用法。
一种是修饰方法名:
public synchonized void methodA(){};
另一种是对代码块使用synchronized(Object)
,如
synchronized(this){
//dome something
}
不通使用方法的效率也不同,最高效的是锁定一个较为小的对象(Object),然后在方法内使用。
private byte[] locks = new byte[1];
public void mathodB(){
synchronized(this.locks){
//do something
}
}
显式锁Lock和ReentrantLock
Lock接口中所有的锁都是显式的,其位于java.util.concurrentLocks.Lock
,及JUC包中,核心方法有lock()
,unlock()
,tryLock()
,实现的类有ReentrantLock
,ReentrantReadWriteLock.ReadLock
,ReentrantReadWriteLock.WriteLock
。
void lock()
:获得锁,如果锁不可用,则将禁用当前线程,并在获得所之前,一直处于休眠状态
boolean tryLock()
:尝试获得锁,仅在锁空闲时才获得锁,如果锁可用,则获得锁,返回true
,否则将立刻返回false。
blloean tryLock(long ParamLong,TimeUtil ParamTimeUtil) throw InterruptedException
:如果锁在给定时间内空闲,并且线程未中断,则获得锁,否则返回false。
void unlock()
:解除锁
ReadWriteLock和ReentrantReadWriteLock
public interface ReadWriteLock{
Lock readLock();
Lock writeLock();
}
ReadWriteLock
适用于读操作较多,写操作较少的场景。其ReadLock
的多个读线程可以访问同一个资源,而仅有一个写线程可以访问资源。即:读-读不互斥、读-写互斥、写-写互斥。
网友评论