本文共 1766 字,大约阅读时间需要 5 分钟。
多线程允许我们“同时”执行多段代码。线程是并发运行的,线程调度会统一规划CPU时间,将CPU的时间划分为若干片段,然后尽可能的均匀分配给所要并发运行的线程。每个线程在获取CPU时间片段后,CPU就会运行它的任务,当时间片段用完后,CPU会离开并执行获取到CPU时间片的线程。这种微观上走走停停,在宏观上感觉是同步进行的现象称为“并发运行”。
这种方式有两个不足之处:
这种方式的优势在于线程和线程要执行任务分离,降低耦合度。
无论是通过匿名内部类直接定义线程任务,还是单独定义 Runnable 接口并传入 Thread 中,都能有效减少线程与任务的耦合度。
线程提供了 static Thread currentThread(),该方法可以获取运行这个方法的线程。在 Java 中,所有的代码都是线程运行的,main 方法也不例外。JVM 启动后会启动一个线程来执行 main 方法,通常我们称执行 main 方法的线程为“主线程”。
线程的优先级可以影响它获取 CPU 时间片段的概率。线程优先级有 10 个等级(1-10),其中 1 代表优先级最低,5 代表默认,10 代表优先级最高。
可以通过调用 Thread.setPriority(int p) 方法设置线程优先级。
通过设置优先级可以观察到线程执行顺序的差异。通常情况下,优先级高的线程会先执行完任务。
sleep 方法可以让线程进入阻塞状态,指定阻塞的时间。线程在睡眠期间不会占用 CPU 时间片段,只会等待 CPU 分配新的时间片。
如果在 sleep 方法阻塞的状态中被其他线程调用 interrupt 方法,线程会抛出 InterruptedException 异常并恢复到 runnable 状态。
通过 sleep 方法可以模拟线程之间的等待时间,例如模拟两个线程之间的对话。
通过 sleep 方法可以实现面板背景色来回切换的效果。
join 方法允许一个线程在另一个线程上等待,直到目标线程完成后再继续执行。
通过 join 方法可以实现线程间的同步运行,确保下载任务完成后再显示图片。
守护线程(后台线程)可以通过 setDaemon(boolean b) 方法设置。默认情况下,线程不是守护线程。
守护线程在进程结束时会被强制终止,这在某些资源管理场景中非常有用。
通过设置 jack 为守护线程,可以观察到线程终止时的行为。
线程池可以有效管理多线程数量,避免资源浪费,提高程序效率。
通过 Executors.newFixedThreadPool(2) 创建一个固定线程池,适用于需要多个线程同时执行任务的场景。
调用 shutdown() 方法可以关闭线程池,同时确保已提交的任务继续执行。
可以通过 Thread 类提供的方法获取线程的详细信息,例如线程 ID、线程名称、优先级、是否为守护线程等。
通过 main 方法获取线程信息,可以更好地理解线程的运行状态。
通过以上内容,可以全面了解 Java 中的多线程基础,包括线程的创建、管理、调度以及线程池等高级主题。
转载地址:http://zgopz.baihongyu.com/