转自:http://www.cnblogs.com/everSeeker/p/5487093.html#3798351
一、线程的状态
Java中,线程的状态有以下6类:NEW, RUNNABLE, BLOCKED, WAITING, TIMED_WAITING, TERMINATED。各状态之间的关系可用下图表示:
二、常用方法介绍
1、thread.start()和thread.run()的区别
1 public static void main(String[] args) { 2 Thread t = new Thread(); 3 t.start(); 4 System.out.println("main end"); 5 }
调用start()方法启动线程t,t线程的状态会从New -> Runnable,t线程和main主线程同时执行。
如果把t.start()改成t.run(),则是普通的调用方法,同步执行,System.out.println("main end")语句必须等t.run()方法执行完毕之后才能执行。
注意:t.run()方法不会改变线程t的状态,也就是说线程没有启动。
2、object.wait()和thread.sleep()的区别
1 private Object obj = new Object(); 2 public void testMethod() throws InterruptedException { 3 synchronized (obj) { 4 obj.wait(); 5 System.out.println("testMethod end"); 6 } 7 }
wait()方法主要用在synchronized同步方法或者同步块中,意味着调用object.wait()之前必须先获取锁,调用wait()方法之后释放锁,线程进入waiting状态。常见用法如上所示。如果有其他线程通过调用object.notify()或者object.notifyAll()方法时,线程必须再次获取到obj锁,然后才能继续执行obj.wait()后的语句,即打印 "testMethod end"。obj.wait(timeout)方法类似,也需要先释放锁。
wait()方法是Object类的方法,而sleep(timeout)方法是Thread类的方法。线程调用sleep(timeout)方法,状态从runnable -> timed_waiting,但是不释放锁。
3、interrupt()方法
当线程调用interrupt()方法时,只是设置了线程的中断状态。 也就是说如果线程处于runnable或者blocked状态的时候,调用interrupt()方法并不会终止线程。于是,我想当然的理解如果线程处于waiting或者timed_waiting状态时,调用interrupt方法会抛出异常,从而终止线程。
然后发现错了。见如下代码:
1 private ReentrantLock lock = new ReentrantLock(); 2 private Condition condition = lock.newCondition(); 3 public void testMethod() { 4 try { 5 lock.lock(); 6 System.out.println("wait begin"); 7 condition.awaitUninterruptibly(); 8 System.out.println("wait end"); 9 } finally { 10 lock.unlock(); 11 } 12 }
condition.awaitUninterruptibly()方法不需要捕获InterruptedException异常,意味着如果线程通过调用awaitUninterruptibly从而使得线程状态为waiting,并不会因为调用interrupt()方法而中断。实际测试,线程状态不响应interrupt方法,只有通过condition.singal或者singalAll才能唤醒线程。
实际测试,wait(), wait(timeout), join(), sleep(timeout), await(), await(timeout)等方法都是可以被interrupt()方法中断的。
三、synchronized关键字
1、synchronized(object): 同步方法或者代码块,锁是一个对象。
2、synchronized(this): this指的是当前对象。
3、针对静态方法,比如synchronized public static void testMethod(),锁是当前的Class类。
4、如果代码抛出异常,锁自动释放。
相关推荐
Java线程状态流转图知识点总结 Java线程状态流转图是一种用于描述Java线程生命周期中不同的状态和状态转换的图形表示方式。该图形展示了Java线程从创建到终止的整个生命周期,并详细介绍了每种状态的特点和转换...
Java 线程状态转换图 Java 线程状态转换图是 Java 编程中非常重要的一个概念,它描述了线程在不同的状态之间的转换关系。了解线程状态转换图对 Java 编程的理解和应用非常重要。本文将详细介绍 Java 线程状态转换图...
### Java线程:线程状态的转换 #### 一、线程状态及其转换 ...通过以上分析,我们可以看到Java线程状态转换的基本原理以及如何利用线程状态来控制线程的行为,这对于开发高性能、高可靠性的并发程序至关重要。
java线程从新建到死亡所能经历的各种状态之间的流转。包括运行到阻塞、进入锁池、等待队列,全面而清晰的一张图
java线程的状态3---马克-to-win java视频的详细描述与介绍
Java线程状态转换是Java多线程编程中的关键概念,对于理解和优化并发程序至关重要。Java线程在其生命周期中经历多种状态,这些状态之间的转换是由线程调度器根据特定的策略来决定的。以下是对Java线程状态转换的详细...
TDA(Thread Dump Analyzer)是一款强大的Java线程分析工具,它能够帮助开发者深入理解应用在运行时的线程状态,包括线程的阻塞情况、等待资源、死锁等问题。下面将详细介绍TDA的使用方法、功能以及它如何帮助我们...
Java线程有五种基本状态:新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)和死亡(Terminated)。线程的状态会随着程序的运行而变化: 1. **新建**:当创建了一个新的线程对象后,该线程处于新建...
在Java编程中,线程是并发执行任务的...总之,理解和掌握Java线程状态的转换以及如何控制线程执行是编写高效并发程序的关键。通过适当的方法,我们可以控制线程的执行顺序,实现线程间的同步和协作,从而优化程序性能。
学习Java线程,理解其创建、状态转换、调度和控制,以及如何处理线程间的互斥和同步,对于开发高效、稳定的并发程序至关重要。通过深入研究这些概念,开发者能够编写出更符合现代计算需求的高质量软件。
Java线程是并发编程的核心部分,它允许程序在同一时间执行多个独立的任务,从而提高系统效率和响应速度。本文将深入探讨Java线程的概念、生命周期、实现方式以及相关的同步机制。 首先,理解线程的基本概念至关重要...
在Java编程中,线程是程序执行的基本单元,它允许应用程序同时执行多个任务。了解如何查看线程的运行状态对于调试和性能优化...通过阅读和分析源码,我们可以更深入地了解Java线程的工作原理,从而提升我们的编程技能。
JAVA线程dump的分析 JAVA线程dump是指在JAVA程序中,当前线程的状态和调用...本文中,我们讨论了如何生成和分析JAVA线程dump,包括了解线程状态、调用堆栈和Monitor的状态等,以及在实际运行中需要注意的一些问题。
Java线程是并发编程的核心部分,...总的来说,Java线程状态和转换是Java并发编程的基础,对于提升软件的并发性和响应性具有重要意义。通过本教程的视频学习,你将能更深入地理解这些概念,并能够在实际开发中灵活运用。
Java线程状态转换关系实例解析 Java线程状态转换关系实例解析是Java多线程编程中的一种重要概念,它指的是Java线程在不同的状态之间的转换关系。了解这些状态转换关系可以帮助开发者更好地编写多线程程序,避免线程...
有点乐趣,小java线程监控程序, 小java线程监控程序 小java线程监控程序
Java线程是多任务编程的重要概念,它允许程序同时执行多个独立的任务,从而提高系统效率和响应速度。在Java中,线程可以分为用户线程和守护线程,前者是程序运行的基础,而后者是在所有用户线程结束时才终止的后台...
Java线程的状态转换是理解多线程编程的关键概念。线程在生命周期中经历五个主要状态:新状态、可运行状态、运行状态、等待/阻塞状态以及死亡态。 1. **新状态**:当通过`new Thread()`创建一个新的线程对象,但尚未...
《Java线程(第三版)》是一本深入探讨Java线程技术的专业书籍,旨在帮助开发者理解和掌握Java平台上的多线程编程。Java线程是并发编程的重要组成部分,它允许程序同时执行多个任务,从而充分利用系统资源,提高程序的...
4. **线程状态**:Java线程有新建、就绪、运行、阻塞和死亡五种状态,可以通过`getState()`获取。 三、线程池与Executor框架 1. **ExecutorService**:Java 5引入了`ExecutorService`接口,它是线程池的抽象,通过...