目录
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 高并发多线程编程系列案例代码 & 教程 & 面试题集锦! !! 包括但不限于线程安全性, atomic包下相关类、CAS原理、Unsafe类、synchronized关键字等的使用及注意事项,
Java并发编程是软件开发中的重要领域,特别是在多核处理器和分布式系统中,高效地利用并发可以极大地提升程序的性能和响应速度。本资源"Java并发编程_设计原则和模式(CHM)"聚焦于Java语言在并发环境下的编程技巧、...
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并发性和多线程是Java开发中至关重要的概念,它们涉及到如何在单个或多个处理器上同时执行程序的不同部分,从而提升程序的效率和响应速度。在这个领域,Java提供了丰富的工具和API,使得开发者能够有效地管理和...
Java多线程与并发编程是Java开发中至关重要的一部分,它涉及到如何高效地利用CPU资源,以实现程序的并行执行。在操作系统层面,多任务和多进程是通过分配不同的内存空间来实现的,而线程则共享同一进程的内存,这...
### JAVA中的单线程与多线程概念解析 #### 单线程的理解 在Java编程环境中,单线程指的是程序执行过程中只有一个线程在运行。这意味着任何时刻只能执行一个任务,上一个任务完成后才会进行下一个任务。单线程模型...
Java并发编程中的线程池是提高系统效率的关键工具,它解决了频繁创建和销毁线程的问题。线程池通过复用已存在的线程来处理任务,从而避免了每次任务执行完毕后销毁线程的开销。在Java中,线程池的核心实现是`java....
第2章介绍了 Java 并行程序开发的基础, 包括 Java 中 Thread 的基本使用方法等第3章介绍了 JDK 内部对并行程序开发的支持, 主要介绍 JUC (Java.util.concurrent) 中些工具的使用方法、 各自特点及它们的内部实现...
Java并发编程是Java开发中的重要领域,而Java.util.concurrent(JUC)工具包则是Java并发编程的核心组件。这个集合提供了一系列高效、线程安全的类和接口,用于简化多线程环境下的编程任务。本资源"JUC代码收集,...
在Java中,可以通过以下几种方式创建线程: 1. **继承Thread类** - 创建一个新的类并继承`Thread`类。 - 重写`run()`方法以定义线程的主体代码。 - 调用`start()`方法来启动线程。 ```java public class ...
本文将深入探讨Java并发编程的设计原则与模式,旨在帮助开发者理解并有效地应用这些原则和模式。 一、并发编程的基础概念 并发是指两个或多个操作在同一时间间隔内执行,而不是严格意义上的同一时刻。在Java中,...
3. **原子类**:原子类是Java并发库中提供的一种高效的线程安全类,它们可以实现无需同步的原子更新操作。 - `AtomicInteger`:用于整型变量的原子操作。 - `AtomicLong`:用于长整型变量的原子操作。 - `...