Java并发编程之多线程基本原理

线程执行基本原理

我们要搞清楚线程是怎样被启动的,就需要先搞清楚CPU调度算法,操作系统的调度算法有很多,比如先来先服务(FIFO)、最短优先、时间片轮转等。

那么当调用线程的start()方法后,它具体做了什么呢?看下面这张图。
在这里插入图片描述
实际上,我们在将一个线程置为运行状态时,也就是调用start()方法时,在JVM和操作系统层面,JVM像操作系统发送了两个指令os:: create threados:: start thread操作系统根据调度算法来分配CPU资源用于执行这两个指令,执行完毕后回调JVM中的JavaThread::run来用于执行run()方法。此时线程就从就绪状态(NEW)变成了运行状态(RUNNABLED)

线程的状态

一般在java中,线程一共有6个状态:

  • NEW:初始状态,线程被构建,但是还没有调用start()方法。
  • RUNNABLED:运行状态,JAVA线程把操作系统中的就绪和运行两种状态统一称为“运行中”。
    • 就绪状态,线程属于运行状态,但是还没有获取到CPU时间片。
    • 运行中状态,线程属于运行状态,且获取到了CPU时间片,正在执行。
  • BLOCKED:阻塞状态,表示线程进入了等待状态,线程因为某种原因放弃了对CPU的使用权,阻塞分为集中:
    • 等待阻塞:线程执行wait()方法,jvm会把当前线程放入到等待队列
    • 同步阻塞:线程在获取对象同步锁时,若该同步锁被其他线程锁占用了,那么jvm会把当前的线程放入到锁池
    • 其他阻塞:运行的线程执行Thread.sleep或者t.join方法,或者发出了I/O请求时,JVM会把当前线程设为阻塞状态,当sleep结束、join线程终止、IO处理完毕则线程会恢复
  • WAITING:等待状态
  • TIME_WAITING:超时等待状态,超时自动返回
  • TERMINATED:终止状态,表示当前线程执行完毕。

用一张图可以更清晰的理解线程生命周期
在这里插入图片描述

线程的中断

当其他线程调用当前线程的interrupt方法,表示向当前线程打个招呼,可以中断当前执行,至于当前线程中断后有什么操作由当前线程自己定。
比如:

public static void main(String[] args) throws InterruptedException {
    Thread thread = new Thread(new Runnable() {
        @Override
        public void run() {
            while (!Thread.currentThread().isInterrupted()) {
                System.out.println("执行");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    System.out.println("interrupt");
                }
            }
        }
    });
    thread.start();
    Thread.sleep(100);
    thread.interrupt();
}
//打印:
//执行
//interrupt
//执行
//执行
//执行
//...

上述代码中,main线程调用了thread.interrupt();,thread线程进行了响应打印了interrupt,但是也仅仅是响应,并没有影响thread线程的继续循环。侧面证明了,当前线程是否能够被中断,由自己决定,我可以回应你,但是回应后是否中断还是由我说的算。

如果想让当前线程收到外界的中断请求后就终止循环怎么办呢?

public static void main(String[] args) throws InterruptedException {
      Thread thread = new Thread(new Runnable() {
          @Override
          public void run() {
              while (!Thread.currentThread().isInterrupted()) {
                  System.out.println("执行");
                  try {
                      Thread.sleep(1000);
                  } catch (InterruptedException e) {
                      System.out.println("interrupt");
                      Thread.currentThread().interrupt();
                  }
              }
          }
      });
      thread.start();
      Thread.sleep(100);
      thread.interrupt();
  }
//执行
//interrupt

在响应了外界的中断请求后,当前线程可以自己改变线程的interrupt状态,来终止while循环,停止线程的运行状态。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程大帅气

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值