转载

初识Java多线程

今天开始来学习一下有关Java多线程的知识,主要有以下知识点:

进程与线程
线程的生命周期
中断线程

进程与线程

1.什么是进程?

进程就是在运行过程中的程序,就好像手机运行中的微信,QQ,这些就叫做进程。

2.什么是线程?

线程就是进程的执行单元,就好像一个音乐软件可以听音乐,下载音乐,这些任务都是由线程来完成的。

3.进程与线程的关系

一个进程可以拥有多个线程,一个线程必须要有一个父进程。

线程之间共享父进程的共享资源,相互之间协同完成进程所要完成的任务。

一个线程可以创建和撤销另一个线程,同一个进程的多个线程之间可以并发执行。

线程的生命周期

初识Java多线程

  • 新建(New)

当线程实例被new出来之后,调用start()方法之前,线程处于新建状态。

  • 可运行(Runnable)

当线程实例调用start()方法之后,线程调度器分配处理器资源之前,线程处于可运行状态

或者线程调度器分配处理器资源给线程之后,线程处于运行中状态,这两种情况都属于可运行状态。

  • 等待(Waitting)

当线程处于运行状态时,线程执行了obj.wait()或Thread.join()方法、LockSupport.park()

以及Thread.sleep()时,线程处于等待状态。

  • 超时等待(Timed Waitting)

当线程处于运行状态时,线程执行了obj.wait(long)、 Thread.join(long)、LockSupport.parkNanos、

LockSupport.parkUntil以及Thread.sleep(long)方法时,线程处于超时等待状态。

  • 阻塞(Blocked)

当线程处于运行状态时,获取锁失败,线程进入等待队列,同时状态变为阻塞。

  • 终止(Terminated)

当线程执行完毕或出现异常提前结束时,线程进入终止状态

注意:在任何给定时刻,一个可运行的线程可能正在运行也可能没有运行(这就是为什么将这个状态称为可运行而不是运行)。

中断线程

interrupt 方法可以用来请求终止线程。

当对一个线程调用interrupt方法时,线程的中断状态将被置位为true。这是每一个线程都具有的boolean标志。

每个线程都应该不时地检查这个标志,已判断线程是否被中断。

源码解析

public void interrupt() {
    if (this != Thread.currentThread())
        checkAccess();//检查权限
        
    synchronized (blockerLock) {
        //判断线程是否被阻塞
        Interruptible b = blocker;
        if (b != null) {
            interrupt0();
            b.interrupt(this);//如果是阻塞线程,则把中断状态设为false后返回
            return;
        }
    }
    interrupt0();//否则把中断状态设为true
}

如果线程被阻塞,就无法检测中断状态。

当在一个被阻塞的线程(调用sleep或wait)上调用interrupt方法时,阻塞调用将会被Interrupt Exception异常中断。

如果阻塞线程调用了interrupt()方法,那么会抛出异常,设置标志位为false,同时该线程会退出阻塞的。(利用这个特性可以打破死锁)

interrupted和isInterrupted区别:

interrupted
isInterrupted
原文  https://segmentfault.com/a/1190000020805371
正文到此结束
Loading...