1,在定义Thread的时候选择实现Runnable接口比继承Thead更灵活,因为java是单继承的嘛。
2,setPriority()方法改变其优先权。
3,setDaemon()方法讲线程设置为后台线程。该方法需要在start()方法之前调用。
4,线程的状态(Thread.State,可以通过getState方法获得):
1)、新状态:线程对象已经创建,还没有在其上调用start()方法。
2)、可运行状态:当线程有资格运行,但调度程序还没有把它选定为运行线程时线程所处的状态。当start()方法调用时,线程首先进入可运行状态。在线程运行之后或者从阻塞 、等待或睡眠状态回来后,也返回到可运行状态。
3)、运行状态:线程调度程序从可运行池中选择一个线程作为当前线程时线程所处的状态。这也是线程进入运行状态的唯一一种方式。
4)、等待/阻塞/睡眠状态:这是线程有资格运行时它所处的状态。实际上这个三状态组合为一种,其共同点是:线程仍旧是活的,但是当前没有条件运行。换句话说,它是可运 行的,但是如果某件事件出现,他可能返回到可运行状态。
5)、死亡态:当线程的run()方法完成时就认为它死去。这个线程对象也许是活的,但是,它已经不是一个单独执行的线程。线程一旦死亡,就不能复生。 如果在一个死去的线程上调用start()方法,会抛出java.lang.IllegalThreadStateException异常。
5,线程进入阻塞状态原因
1),调用sleep()方法
2),调用wait()使线程挂起。知道线程得到了notify()或notifyAll()消息,线程才会进入可运行状态。
3),线程在等待某个输入/输出完成。
4),线程视图在某个对象上调用其同步控制方法,但对象锁不可用。
6,sleep方法,sleep时间没有被确保说一定是精确的,这个受限于操作系统的策略。另外,在sleep阶段内线程可以被终止by interrupts。无论如何,你都不能假定触发sleep会让线程很精确的暂停预设的时间。
7,http://docs.oracle.com/javase/tutorial/essential/concurrency/interrupt.html
interrupt对于一个线程,标示着它应该停下它正在做的事情来做些其他的。具体的是由程序员来决定一个线程如何回应interrupt,一般都是让这个线程终止。
一个线程通过调用 interrupt()方法来触发这个线程的interrupt事件。为了正确的实现interrupt机制,被中断的线程需要支持自己的interruption。
当外部线程对某线程调用了thread.interrupt()方法后,java语言的处理机制如下:
如果该线程处在可中断状态下,(调用了xx.wait(),或者Selector.select(),Thread.sleep()等特定会发生阻塞的 api),那么该线程会立即被唤醒,同时会受到一个InterruptedException,同时,如果是阻塞在io上,对应的资源会被关闭。如果该线 程接下来不执行“Thread.interrupted()方法(不是interrupt),那么该线程处理任何io资源的时候,都会导致这些资源关闭。 当然,解决的办法就是调用一下interrupted(),不过这里需要程序员自行根据代码的逻辑来设定,根据自己的需求确认是否可以直接忽略该中断,还 是应该马上退出。
如果该线 程处在不可中断状态下,就是没有调用上述api,那么java只是设置一下该线程的interrupt状态,其他事情都不会发生,如果该线程之后会调用行 数阻塞API,那到时候线程会马会上跳出,并抛出InterruptedException,接下来的事情就跟第一种状况一致了。如果不会调用阻塞 API,那么这个线程就会一直执行下去。除非你就是要实现这样的线程,一般高性能的代码中肯定会有wait(),yield()之类出让cpu的函数,不 会发生后者的情况。
关于线程阻塞:
如果一个线程由于等待某些事件的发生而被阻塞,又该如何实现该线程的中断呢?比如当一个线程由于需要等候键盘输入而被阻塞,处于不可运行状态时,即使主程序中将该线程的共享变量设置为true,但该线程此时根本无法检查循环标志,当然也就无法立即中断。
其实,这种情况经常会发生,比如调用Thread.join()方法,或者Thread.sleep()方法,在网络中调用 ServerSocket.accept()方法,或者调用了DatagramSocket.receive()方法时,都有可能导致线程阻塞。即便这 样,仍然不要使用stop()方法,而是使用Thread提供的interrupt()方法,因为该方法虽然不会中断一个正在运行的线程,但是它可以使一 个被阻塞的线程抛出一个中断异常,从而使线程提前结束阻塞状态,退出堵塞代码。
interrupt机制实现是用了中间的标志位interrupt status。调用Thread.interrupt这个静态方法会检查状态并清空重置状态,而非静态方法isInterrupted只是进行状态的查询,无清空重置。即:
Thread.interrupted 是 currentThread.isInterrupted(true) , 会返回当前的interrupted状态位,并清空状态
thread.isInterrupted 是 isInterrupted(false) 只返回状态,不做清空处理
interrupt 方法并不直接中断线程或者抛出InterruptedException,而是设置 interrupted 标志位。Object.wait, Thread.sleep方法,会不断的轮询监听 interrupted 标志位,发现其设置为true后,会停止阻塞并抛出 InterruptedException异常。
Object.wait, Thread.join, Thread.sleep, interrupt调用后,会清空其interrupt状态,并抛出InterruptedException异常
除以上清空外,其它阻塞,例如:IO操作的阻塞,java.nio.channels.InterruptibleChannel, channels.Selector, interrupt调用后,会设置其interrupt状态
假如在IO阻塞的interrupt调用后,不进行Thread.interrupted调用清除标志位,则下一次IO调用,会直接抛出异常。
nio.AbstractInterruptibleChannel通过实现Interruptible接口的对象,监听线程的interrupt事件,通过 sun.misc.SharedSecrets.getJavaLangAccess().blockedOn(Thread.currentThread(), interruptibleObject); 注册监听器
在Channel每次做动作时,会通过Thread.currentThread().isInterrupted()检查线程的当前状态,假如正处于interrupted状态中,则调用interruptibleObject.interrupt方法
总结:程序应该对线程中断作出恰当的响应。响应方式通常有三种:(来自温绍锦(昵称:温少):http//www.cnblogs.com/jobs/)
至于具体让线程停止的方法,可以通过变量标志位,比如while(!stop){}配合上interrupt来实现,根据具体的需求,如果线程中未对interrupt状态做处理,直接调用interrupt方法想终止线程运行是行不通的。
8,join方法
join方法运行一个线程等待另外一个线程完成。如果t是一个线程对象,某个线程在另一个线程t上调用t.join(),此线程将被挂起,知道目标线程结束才恢复(即t.isAlive返回为false)。也可以在join()时带上个超时参数。join方法和sleep一样,都对被interrupt方法中断。
参考:http://daydayup1989.iteye.com/blog/785581
相关推荐
java 线程中的 interrupt,isInterrupt,interrupted 方法详解 在 Java 中,线程(Thread)类提供了三个相关的方法:interrupt、isInterrupted 和 interrupted,这三个方法都是用于处理线程的中断状态的。下面我们将...
`Thread.interrupt()`方法是中断线程的主要手段,但它的行为并不像字面意义上那样直接终止线程。相反,它通过设置线程的中断状态来向线程发送一个中断信号,这个信号是一个内部标志,告知线程应该停止其当前的工作。...
当一个类直接继承自Thread类时,该类就具有了启动线程的能力。我们需要重写Thread类的run()方法,这个方法包含了线程要执行的任务。创建线程对象后,通过调用start()方法启动线程,系统会自动调用run()方法。 ```...
### Java线程中断机制详解:`interrupt`与`stop`方法 #### 一、引言 在Java多线程编程中,线程控制是至关重要的技术之一。有时我们需要在特定条件下停止某个线程的执行,或者中断正在等待的线程。Java提供了多种...
详解Java中Thread和Runnable区别 Java中Thread和Runnable是两个不同的概念,它们都是Java中的线程机制,但是它们之间有着本质的区别。 Thread是Java中的一个类,而Runnable是一个接口。Thread类实现了Runnable接口...
`Thread.interrupt()`方法可以请求线程中断,但不会立即停止线程。线程需要在适当位置检查`Thread.currentThread().isInterrupted()`,并在可能的情况下结束。 9. **守护线程(Daemon)**: 守护线程在所有非守护...
《RTThread STM32F2空工程移植详解》 在嵌入式开发领域,RTOS(实时操作系统)的应用越来越广泛,RTThread作为一款优秀的开源RTOS,因其高效、稳定、易用的特点,深受开发者喜爱。本文将深入探讨如何在STM32F2系列...
### nachos 详解 #### Nachos 教学用操作系统概览 **Nachos** 是一个专为计算机科学教育设计的操作系统框架,旨在帮助学生更好地理解操作系统的基本原理与实践技巧。其设计之初便聚焦于可读性、简洁性和教育价值,...
#### 一、ThreadX启动过程详解 ThreadX是一个轻量级的实时操作系统(RTOS),广泛应用于嵌入式系统中。本节将详细解析ThreadX从启动到正常运行的全过程。 ##### 1. 注册中断向量表 ThreadX在启动时会首先初始化...
接下来,`handle_interrupt`会根据当前线程(current)和handler thread的优先级进行决策。如果当前线程是空闲线程,直接切换到handler thread。如果handler thread的优先级更高,且当前线程允许被抢占,也会进行...
Thread类提供了interrupt()方法用于中断线程,但需要注意的是,这并不意味着线程会立即停止,而是在线程检查到中断标志后自行决定是否停止。守护线程(Daemon Thread)是一种特殊线程,当所有非守护线程结束时,守护...
`Thread.interrupt()`方法可以用来中断一个线程,而`isInterrupted()`和`interrupted()`检查中断状态。守护线程(Daemon Thread)是一种在所有用户线程结束后自动结束的线程,通常用于后台服务。 总之,Java多线程...
《RT-Thread API详解》 RT-Thread是一个成熟的、开源的实时操作系统(RTOS),它以其高效、稳定和易用的特点,被广泛应用于物联网(IoT)、智能家居、工业控制等领域。"RT_Thread-api.rar"是一个包含RT-Thread API...
中断线程是一个重要的概念,`Thread.interrupt()`方法用来请求一个线程停止其当前的执行。它不会立即停止线程,而是设置线程的中断标志。当线程在阻塞状态下(如调用`sleep()`, `join()`, 或者`wait()`),检测到...
当一个类继承自Thread类,就可以重写run()方法来定义线程执行的任务。然后通过调用start()方法启动线程。以下是一个简单的例子: ```java public class ThreadDemo1 { public static void main(String[] args){ ...
4. **执行环境(Execution Context)**:工作队列中的任务会在一个称为工作者线程(Worker Thread)的内核线程上下文中执行。这意味着工作函数可以调用用户态函数,使用锁和等待队列,甚至睡眠。 5. **同步机制...
Java提供了`Thread.interrupt()`方法来中断线程,但需要注意的是,中断并不立即停止线程,而是设置一个中断标志。线程需要检查这个标志并相应地处理中断请求。 以上是Java多线程设计模式的一些核心概念和应用实例。...
### C#/.NET 多线程详解 #### 一、多线程基本概念 ##### 1.1 什么是线程? 线程是操作系统中能够独立运行的最小单位,同时也是程序中能够并发执行的一段指令序列。它作为进程的一部分存在,一个进程可以包含一个...