线程的让位在 Java 中,线程的让位是指线程主动放弃当前对 CPU 资源的占用,使得调度器可以选择其他线程来执行。线程让位可以通过 Thread.yield() 方法来实现。以下是对 Java 线程让位的一些详细介绍:
一、Thread.yield() 方法Thread.yield() 是一个静态方法,调用此方法的线程会主动请求让出 CPU 使用权,但具体的实现依赖于操作系统的线程调度算法。Thread.yield() 的作用如下:
让出当前线程所占用的 CPU 时间片。
将当前线程的状态设置为可运行状态(Runnable),使得调度器可以重新选择其他具有相同优先级的线程来运行。
可能会立即选择同一个线程继续执行,这取决于操作系统的调度策略。
yield()是静态方法
二、示例代码123456789101112131415161718192021222324package com.camellia.thread.yield;public class ThreadYield { public static void main(String[] args) ...
线程的合并在Java中,join()方法是Thread类中的一个方法,它允许一个线程等待另一个线程完成执行后再继续执行。具体来说,当一个线程调用另一个线程的join()方法时,它会暂停自己的执行,直到被调用的线程执行完毕或者超时。
join()方法是一个实例方法。(不是静态方法)
假设在main方法(main线程)中调用了 t.join(),后果是什么?
t线程合并到主线程中。主线程进入阻塞状态。直到 t 线程执行结束。主线程阻塞解除。
和sleep方法有点类似,但不一样:
第一:sleep方法是静态方法,join是实例方法。
第二:sleep方法可以指定睡眠的时长,join方法不能保证阻塞的时长。
第三:sleep和join方法都是让当前线程进入阻塞状态。
第四:sleep方法的阻塞解除条件?时间过去了。 join方法的阻塞解除条件?调用join方法的那个线程结束了。
一、join()方法的使用方式
基本用法:
12345678910111213Thread thread = new Thread(() -> { // 线程执行的代码} ...
线程的优先级一、关于线程生命周期中的JVM调度
线程的优先级是可以设置的,优先级较高的,获得CPU时间片的总体概率高一些。
JVM采用的是抢占式调度模型。谁的优先级高,获取CPU时间片的总体概率就高。
默认情况下,一个线程的优先级是 5。
最低是1,最高是10。
12345678910111213141516171819202122package com.camellia.thread.ThreadPriority; import org.junit.jupiter.api.Test;public class ThreadPriorityTest { public static void main(String[] args) { System.out.println("线程最低优先级:"+Thread.MIN_PRIORITY); System.out.println("线程的最高优先级"+Thread.MAX_PRIORITY); System.out.println(& ...
定时任务一、Timer 和 TimerTask1.1 Timer 和 TimerTask 的基本概念
**Timer**:用于安排和管理定时任务的类。它可以调度任务在将来的某个时间点执行,或者周期性地执行。
**TimerTask**:一个抽象类,表示一个可以被 Timer 调度的任务。需要继承这个类并实现 run() 方法来定义任务的具体内容。
1.2 实现步骤
创建一个 Timer 实例。
创建一个继承自 TimerTask 的任务类,并实现其 run() 方法。
使用 Timer 实例安排任务的执行时间和周期。
1.3 示例代码12345678910111213141516171819202122232425262728293031323334353637383940414243import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.Date;import java.util.Timer;import java.util.TimerTask;public class ...
!!! note 目录
守护线程守护线程(Daemon Thread)是 Java 中的一种特殊线程,其主要用于后台服务,如垃圾回收器等。与用户线程不同,当所有用户线程都结束时,守护线程会自动终止。守护线程的存在并不会阻止 JVM 退出。守护线程的生命周期依赖于用户线程,只有在所有用户线程都结束时,JVM 才会终止守护线程。
一、创建守护线程
创建线程对象:可以通过继承 Thread 类或实现 Runnable 接口来创建线程对象。
将线程设置为守护线程:使用 Thread 类的 setDaemon(true) 方法将线程设置为守护线程。必须在启动线程之前调用此方法,否则会抛出 IllegalThreadStateException 异常。
启动线程:调用 start() 方法启动线程。
二、示例代码12345678910111213141516171819202122232425262728293031323334353637383940414243444546package com.camellia.thread.DaemonThread;/** * <p> ...
!!! note 目录
线程的终止方法在Java中,终止线程并不是一个简单的操作,因为不建议直接强制终止一个线程。Java不再支持如 Thread.stop() 方法,因为这种方式可能会导致数据的不一致和资源的泄漏。相反,推荐的方式是通过设置一个标志来通知线程自行终止。
使用标志位通过设置一个标志位,让线程在下次检查到该标志位时自行终止。这种方式是最推荐的,因为它允许线程在终止前完成必要的清理工作。
12345678910111213141516171819202122public class MyThread extends Thread { private volatile boolean running = true; public void run() { while (running) { // 线程执行的代码 System.out.println("Thread is running..."); try ...
!!! note 目录
关于线程的休眠一、sleep方法(休眠线程)
静态方法 sleep(long millis)
方法签名:static void sleep(long millis)
说明:
这是一个静态方法。
没有返回值。
参数是一个毫秒数。1秒 = 1000毫秒。
方法作用
让当前线程进入休眠状态,也就是让当前线程放弃占有的CPU时间片,使其进入阻塞状态。
具体含义:当前线程不再占用CPU,让给其他线程使用。
阻塞时长:根据传入的毫秒参数决定。在指定的时间范围内,当前线程没有权利抢夺CPU时间片。
“当前线程”解释
Thread.sleep(1000); 这行代码在哪个线程中执行,那么当前线程就是那个线程。
关于 run 方法
在重写 run 方法时,不能在方法声明位置使用 throws 抛出异常。
使用 sleep 方法的场景
sleep 方法可以用来模拟每隔固定时间调用一次程序。
1234567891011121314151617181920212223242526272829303132333435363738394 ...
!!! note 目录
线程的生命周期Java 线程的生命周期描述了一个线程从创建到终止的整个过程。
一、线程的生命周期七个状态
新建(New):
当新创建一个线程对象时,线程处于新建状态。
此时线程还没有开始运行,尚未分配 CPU 和其他资源。
就绪(Runnable):
当调用线程的 start() 方法后,线程进入就绪状态。
处于就绪状态的线程已经分配了所有必要的资源,等待系统调度执行。
运行(Running):
当线程获取了 CPU 资源并开始执行时,线程进入运行状态。
此时线程正在执行任务中,直到任务执行完毕或者发生阻塞。
阻塞(Blocked):
在特定情况下,线程会进入阻塞状态,暂时停止执行。
常见的阻塞情况包括等待某个资源、等待输入/输出完成、等待获取锁等。
等待(Waiting):
线程处于等待状态,等待其他线程的通知或者特定条件的满足。
进入等待状态的线程可以通过 wait()、join() 或者 sleep() 等方法触发。
超时等待(Timed Waiting):
线程等待一段指定的时间后自动恢复到就绪状态。
通 ...
!!! note 目录
线程的常用方法一、Java Thread 构造函数
构造函数
描述
Thread()
初始化一个新平台 Thread。
Thread(Runnable task)
初始化一个新平台 Thread。
Thread(Runnable task, String name)
初始化一个新平台 Thread。
Thread(String name)
初始化一个新平台 Thread。
Thread(ThreadGroup group, Runnable task)
初始化一个新平台 Thread。
Thread(ThreadGroup group, Runnable task, String name)
初始化一个新平台 Thread,使其具有 task 作为其运行对象、具有指定 name 的名称并且属于所引用的线程组 group。
Thread(ThreadGroup group, Runnable task, String name, long stackSize)
初始化一个新平台 Thread,使其具有 task 作为其运行 ...
!!! note 目录
多线程的实现在Java中实现多线程主要有两种方式:继承Thread类和实现Runnable接口。
一、继承Thread类继承Thread类是实现多线程的一种方式,通过创建一个新的类继承自Thread类,并重写其run()方法来定义线程的任务。
1.1 实现步骤
创建一个继承自Thread的类。
重写run()方法,定义线程执行的代码。
创建Thread类的实例。
调用实例的start()方法来启动线程。
1.2 示例代码1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253package com.camellia.thread.ImplementingMultiThreading_2;/** * 本类展示了在Java中实现多线程的第二种方式: * 通过实现`java.lang.Runnable`接口来创建和运行线程。 * 在这个示例中,我们定义了一个实现了`Runnable`接口的类`MyRunnable`,并在主 ...