目录
1.生命周期
2.常用方法
3.守护线程
1.生命周期
1)初始状态 此时线程处于JVM的进程中,只是创建了一个线程对象,并没有开始运行.(new())
2)就绪状态
此时线程进入可运行状态,等待CPU调度.(start())
3)运行状态
拥有CPU的执行权,并且开始运行线程.(run())
4)阻塞状态
线程在等待IO或者调入了sleep()或join()等方法会导致线程进入阻塞状态,从阻塞状态出来的线程不一定马上回到运行状态,而是回到可运行状态等待CPU的再次调度.(blocked)
5)等待队列状态
一个线程调用一个对象的wait()方法会放弃该对象的锁并进入等待队列状态,只有当另一线程调用临界资源的notify()或者notifyAll()才会将等待队列中的线程释放,进入锁池状态.(waiting)
6)锁池状态
每个对象都有互斥锁标记,如果一个线程想访问一个对象,而该对象的锁标记已被另一线程占用,则该线程进入锁池状态.从锁池状态出来的线程回到可运行状态,等待CPU调度.(locked)
7)终止状态
一个线程运行结束后称为终止状态,也叫死亡状态一个进程只有所有的线程退出后才能终止.(dead)
2.常用方法
线程操作
currentThread() 返回对当前正在执行的线程对象
run() 线程体内执行的代码应该都放在run方法里,用户不应该直接调用run()方法
start() 使该线程开始执行并调用该线程的run方法
yield() 暂停当前正在执行的线程对象,并执行其他线程
sleep() 在指定的毫秒数内让当前正在执行的线程休眠
join() 等待该线程终止
interrupt() 中断线程
线程测试
isAlive() 测试线程是否处于活动状态
isInterrupted() 测试线程是否已经中断
isDaemon() 测试该线程是否为守护线程
线程属性
setName() 改变该线程的名称
getName() 返回该线程的名称
setPriority() 更改线程的优先级
getPriority() 返回线程的优先级
setDaemon() 将该线程标记为守护线程或用户线程
1)每一个java程序都有一个默认的主线程,即main()函数.
public class ThreadDemo { public static void main(String[] args) { Thread thr = new Thread(new MyThread()); thr.start(); int j = 0; while (j++ < 10) { System.out.println(Thread.currentThread().getName() + "..." + j); try { Thread.sleep(1000); } catch (InterruptedException e) { } } } } class MyThread implements Runnable { @Override public void run() { int i = 0; while (i++ < 10) { System.out.println(Thread.currentThread().getName() + "..." + i); try { Thread.sleep(1000); } catch (InterruptedException e) { } } } }
运行结果:main线程和Thread-0线程不规则交替执行,各自每隔1s输出直到结束.
2)调用join方法会在当前线程内等待某一线程终止,内部调用了Object的wait()方法.例:
public class ThreadDemo { public static void main(String[] args) { Thread thr = new Thread(new MyThread()); thr.start(); try { thr.join(); } catch (InterruptedException e) { } int j = 0; while (j++ < 100) { System.out.println(Thread.currentThread().getName() + "..." + j); } } } class MyThread implements Runnable { @Override public void run() { int i = 0; while (i++ < 100) { System.out.println(Thread.currentThread().getName() + "..." + i); } } }
运行结果:Thread-0线程全部输出完毕,main线程才继续执行.
3)调用interrupt()方法可以使得处于阻塞状态的线程抛出一个异常,不会中断正在运行的程序.例:
public class ThreadDemo { public static void main(String[] args) { Thread thr = new Thread(new MyThread()); thr.start(); try { Thread.sleep(1000); } catch (InterruptedException e) { } thr.interrupt(); } } class MyThread implements Runnable { @Override public void run() { int i = 0; while (i++ < Integer.MAX_VALUE) { System.out.println(Thread.currentThread().getName() + "..." + i); } } }
运行结果:thr会一直运行.
但是,调用interrupt()会将中断标志位(isInterrupted())置为true,因此可以通过判断标志位来中断线程:
class MyThread implements Runnable { @Override public void run() { int i = 0; while (!(Thread.currentThread().isInterrupted()) && i++ < Integer.MAX_VALUE) { System.out.println(Thread.currentThread().getName() + "..." + i); } } }
运行结果:thr运行一段时间后停止.
一般情况下不建议通过这种方式来中断线程,一般会在MyThread类中增加一个属性isStop来标志是否结束while循环,然后再在while循环中判断isStop的值.
3.守护线程
通过setDaemon(true)方法可以设置一个线程为守护线程,守护线程优先级比较低,随着主线程运行完毕自动结束.在JVM中,像垃圾收集器线程就是守护线程.例:
public class Test { @Override public void finalize() { System.out.println(Thread.currentThread().getName() + "收垃圾喽~"); } public static void main(String[] args) { new Test(); System.gc(); System.out.println("主线程Over~"); } }
运行结果:
主线程Over~
Finalizer收垃圾喽~
相关推荐
Java线程:并发协作-生产者消费者模型 Java线程:并发协作-死锁 Java线程:volatile关键字 Java线程:新特征-线程池 Java线程:新特征-有返回值的线程 Java线程:新特征-锁(上) Java线程:新特征-锁(下) Java...
最后,Java并发库还包含了很多其他有用的工具,如Semaphore(信号量)用于控制同时访问特定资源的线程数量,CyclicBarrier(循环屏障)和CountDownLatch(计数器门锁)用于多线程间的协作,以及Lock接口及其实现如...
在Java编程中,多线程并发是提升程序执行效率、充分利用多核处理器资源的重要手段。本文将基于"java 多线程并发实例"这个主题,深入探讨Java中的多线程并发概念及其应用。 首先,我们要了解Java中的线程。线程是...
JAVA并发:让线程们翻山越岭,协调有序的舞蹈
《Java并发编程:设计原则与模式(第二版)》是一本深入探讨Java多线程编程技术的权威著作。这本书详细阐述了在Java平台中进行高效并发处理的关键概念、设计原则和实用模式。以下是对该书内容的一些核心知识点的概述...
Java 高并发多线程编程系列案例代码 & 教程 & 面试题集锦! !! 包括但不限于线程安全性, atomic包下相关类、CAS原理、Unsafe类、synchronized关键字等的使用及注意事项,
《Java并发编程:设计原则与模式》是一本深入探讨Java多线程编程的书籍,它涵盖了并发编程中的关键概念、原则和模式。在Java中,并发处理是优化应用程序性能、提高资源利用率的重要手段,尤其在现代多核处理器的环境...
这些API是Java并发编程的核心,书中会详细解析它们的使用方法和应用场景。 3. **线程安全**:线程安全是并发编程中的重要主题,书中会探讨各种线程安全的实现策略,如使用`synchronized`关键字、`volatile`变量、`...
《Java并发编程:设计原则与模式(第二版)》是一本深入探讨Java平台上的多线程和并发编程的权威著作。这本书旨在帮助开发者理解和掌握如何有效地编写可扩展且高效的并发程序。以下是书中涵盖的一些关键知识点: 1....
In this chapter, we will cover: 1.Synchronizing a method; 2.Arranging independent attributes in synchronized classes; 3.Using conditions in synchronized code; 4.Synchronizing a block of code with a ...
`ExecutorService`是Java并发工具包中的核心接口之一,它定义了一组线程池管理的方法,可以帮助我们更加高效地管理和调度线程。 - **固定大小的线程池**:`newFixedThreadPool(int nThreads)`创建一个可重用的固定...
线程池是Java并发编程中的重要概念,它有效地管理和控制线程的创建和销毁,提高了系统资源的利用率。Java中,可以通过`Executors`类创建不同类型的线程池: 1. **固定大小线程池**:`newFixedThreadPool(int ...
Java并发多线程是Java编程中的重要组成部分,它允许程序同时执行多个任务,极大地提高了程序的效率和响应性。在Java中,多线程主要通过`Thread`类、`Runnable`接口以及`ExecutorService`来实现。下面我们将深入探讨...
书中深入讨论了Java并发容器,如ArrayList、LinkedList、HashSet、HashMap以及并发优化过的ConcurrentHashMap、CopyOnWriteArrayList和CopyOnWriteArraySet等,以及它们在多线程环境下的性能和使用策略。 4. **...
Java并发性和多线程是Java开发中至关重要的概念,它们涉及到如何在单个或多个处理器上同时执行程序的不同部分,从而提升程序的效率和响应速度。在这个领域,Java提供了丰富的工具和API,使得开发者能够有效地管理和...
《Java并发编程:设计原则与模式2中文版》是一本深度探讨Java开发中并发编程的专著,旨在帮助开发者理解和掌握在多线程环境下编写高效、安全、可维护的代码。这本书涵盖了Java并发编程的核心概念、最佳实践以及常用...
Java多线程与并发编程是Java开发中至关重要的一部分,它涉及到如何高效地利用CPU资源,以实现程序的并行执行。在操作系统层面,多任务和多进程是通过分配不同的内存空间来实现的,而线程则共享同一进程的内存,这...
Java并发编程中的线程池是提高系统效率的关键工具,它解决了频繁创建和销毁线程的问题。线程池通过复用已存在的线程来处理任务,从而避免了每次任务执行完毕后销毁线程的开销。在Java中,线程池的核心实现是`java....
第2章介绍了 Java 并行程序开发的基础, 包括 Java 中 Thread 的基本使用方法等第3章介绍了 JDK 内部对并行程序开发的支持, 主要介绍 JUC (Java.util.concurrent) 中些工具的使用方法、 各自特点及它们的内部实现...