JoJo的个人博客

记录精彩的程序人生

目录
多线程
/  

多线程

线程和进程

线程是操作系统能够进行运算调度的最小单位(程序执行的最小单元),它被包含在进程之中,是进程中的实际运作单位

进程是操作系统进行资源分配和调度的基本单位(资源分配的最小单位),进程可以理解为一个应用程序的执行过程,应用程序一旦执行,就是一个进程。不同的进程之间的地址空间和资源是独立的

一个程序至少一个进程,一个进程至少一个线程

多线程的实现方式

继承Thread类

class MyThread extends Thread {
 @Override
 public void run() {
    System.out.println(Thread.currentThread().getName());
 }
}
Thread t = new MyThread();

实现Runnable接口

  • 可以避免java中的单继承的限制
  • Runnable的实现类可以作为独立单元被线程共享
class MyThread implements Runnable {
 @Override
 public void run() {
    System.out.println(Thread.currentThread().getName());
 }
}
Thread t = new Thread(new MyThread());

实现Callable接口

Callablecall()方法可以返回值和抛出异常,而Runnablerun()方法没有这些功能。Callable可以返回装载有计算结果的Future对象

class MyThread implements Callable<Integer> {
 
 @Override
 public Integer call() throws Exception {
  System.out.println(Thread.currentThread().getName());
  return null;
 }
}
//创建MyThread实例
Callable<Integer> c = new MyThread();
//获取FutureTask
FutureTask<Integer> ft = new FutureTask<Integer>(c);
//使用FutureTask初始化Thread FutureTask本质也是一个Runnable
Thread t = new Thread(ft);
t.start();

start方法和run方法的区别

调用start方法方可启动线程,而run方法用于写线程执行的任务内容,在主线程里执行

synchronized、Lock和volatile

  • synchronized 对象锁 锁住当前变量

    synchronized可以保证在同一时刻,只有一个线程可以执行某个方法或某个代码块

  • Lock是一个接口 实现类ReentrantLock

    需要使用lockunlock方法进行手动的锁开启和关闭

    乐观锁机制 假设没有冲突,有冲突就重试,直到成功为止。synchronized是悲观锁机制,其他线程只能依靠阻塞来等待线程释放锁

  • volatile 修饰的变量,从主内存中读取,不允许线程拷贝变量副本

    具体可以查看java篇-synchronized和lockjava篇-volatile

sleep、wait和yield

  • sleep方法来自Threadwait方法来自Object,作用都是阻塞线程
  • 最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法(锁代码块和方法锁)。
  • waitnotifynotifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用(使用范围)
  • sleep必须捕获异常,而waitnotifynotifyAll不需要捕获异常
  • yield方法来自Thread,当前线程进入就绪状态,让优先级高的线程运行

wait和notify

调用了对象的wait方法而不调用notify方法,则线程永远处于挂起状态

wait线程进入等待池

notify对于在此对象的监视器上等待的所有线程(通过使用任何一个wait()方法),方法notify()通知任何一个线程任意唤醒。确切唤醒哪个线程的选择是非确定性的 ,取决于实现

调用了notify后只要一个线程会由等待池进入等锁池,而notifyAll会将该对象等待池内的所有线程移动到等锁池中,等待锁竞争

线程的状态

新建就绪运行阻塞死亡

线程执行start或者yield方法或者对象执行notify后进入就绪状态

阻塞分为 等待阻塞(wait)、同步阻塞、其他阻塞(sleep)


标题:多线程
作者:SunnySky
地址:https://www.tianyang.pub/articles/2020/06/04/1591269547928.html

评论