终止线程方式

2021-02-168

终止线程方式

1正常结束运行

2 使用标志退出线程

使用了一个 Java 关键字 volatile,这个关键字的目的是使 exit 同步,也就是说在同一时刻只 能由一个线程来修改exit的值。

使用boolean值标记开关来控制推出开启状态,常用在循环中

3 interrupt()方法中断线程

--1)处于blocked阻塞的状态时:阻塞过程捕获中断异常然后break来退出

     Sleep,同步锁waitsocket receiver accept等方法时,会使线程处于阻塞状态

        当运行interrupt方法时,会抛出InterruptException异常

        通过代码捕获此异常可通过break跳出循环状态从而结束这个进程

        从而结束run方法

--2)处于未阻塞的状态 :非阻塞过程中通过判断中断标志来退出

        使用isInterrupted()方法判断线程中断标志来推出循环

使用interrupt方法时,是否中断=true

 

4 stop 方法终止线程(线程不安全)

程序中可以直接使用thread.stop()来强行终止线程

但是stop方法是很危险的

hread.stop()调用之后,创建子线程的线程就会抛出 ThreadDeatherror 的错误,并且会释放子 线程所持有的所有锁。

一般任何进行加锁的代码块,都是为了保护数据的一致性,如果在调用 thread.stop()后导致了该线程所持有的所有锁的突然释放(不可控制),那么被保护数据就有可能呈 现不一致性,其他线程在使用这些被破坏的数据时,有可能导致一些很奇怪的应用程序错误

 

Sleep() and Wait()

Thread类中的。而wait()方法,则是属于 Object类中的。

sleep():

使当前执行线程休眠,以指定特定时间,以系统定时器和调度器的精度和准确性为准。

线程不会丢失任何监视器(monitor)的所有权

Sleep没有释放锁,成处于同步状态,monitor仍然存在,睡眠结束自动运行

wait():

当前线程必须拥有该对象的监视器(monitor)

线程释放此监视器(monitor)的所有权,并等待。

Notify或者notifyall通知该线程获得监视器并重新恢复运行

Wait释放对象锁,所以不处于同步状态

 

【等待池和锁池 如果对象锁被线程A拥有,别的线程想要进入synchronized方法之前必须要获得对象锁的拥有权,但对象锁正在被A 拥有,这些线程就进入该对象的锁池中,如果调用objectwait方法,该线程释放对象锁,此线程进入wait pool,另一个线程调用该object notifyAll方法然后,所有线程进入lock pool,然后调用notify的话锁池中的线程竞争出一个线程来进入运行状态

 

 

Start() and run()

run方法是Runnable接口中定义的,start方法是Thread类定义的。 所有实现Runnable的接口的类都需要重写run方法,run方法是线程默认要执行的方法。

调用start方法后,则表示Thread开始执行,此时run变成了Thread的默认要执行普通方法。

 

通过start()方法可以异步调用run方法(多线程),直接调用run方法时是同步的(单线程)

 

JVM可以调度处于就绪状态的线程

start启动线程 线程进入就绪状态(runnable

run执行线程 线程进入运行状态(running