Java系列之多线程

多线程创建方法

  1. 继承Thread类,但是受限于单继承
  2. 实现Runnable接口,是最常用的方法
  3. 实现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的多个读线程可以访问同一个资源,而仅有一个写线程可以访问资源。即:读-读不互斥、读-写互斥、写-写互斥。

你可能感兴趣的:(Java系列之多线程)