Java 中的多线程——你必须知道的一切
当我们运行实际应用程序时,我们会使用优质处理器来加快执行速度。但是,仅靠处理器速度并不能让您的应用程序运行得更快。创建性能高效的应用程序的最佳方法之一是利用多线程。
什么是多线程?
多线程是一种编程概念,其中应用程序可以创建一个小的任务单元来并行执行。如果您正在使用计算机,它会运行多个应用程序并为它们分配处理能力。一个简单的程序按顺序运行,代码语句逐个执行。这是一个单线程应用程序。但是,如果编程语言支持创建多个线程并将它们传递给操作系统以并行运行,则称为多线程。
多线程与多处理
当我们谈论多线程时,我们并不关心机器是 2 核处理器还是 16 核处理器。我们的工作是创建一个多线程应用程序,并让操作系统处理分配和执行部分。简而言之,多线程与多处理无关。
Java 如何支持多线程?
Java 对多线程应用程序有很好的支持。Java 通过Thread类支持多线程。Java Thread 允许我们创建一个执行某些任务的轻量级进程。我们可以在程序中创建多个线程并启动它们。Java 运行时将负责创建机器级指令并与操作系统协同并行执行它们。
有哪些不同类型的线程?
应用程序中有两种类型的线程 -用户线程和守护线程。当我们启动应用程序时,主线程是创建的第一个用户线程。我们可以创建多个用户线程以及守护线程。当所有用户线程都执行完毕后,JVM 将终止该程序。
什么是线程优先级?
当我们创建一个线程时,我们可以为其分配优先级。我们可以为不同的线程设置不同的优先级,但这并不能保证优先级较高的线程会比优先级较低的线程先执行。线程调度程序是操作系统实现的一部分,当启动线程时,其执行由线程调度程序控制,JVM 对其执行没有任何控制权。
如何在 Java 中创建线程?
我们可以通过实现Runnable接口或扩展Thread类来创建线程。
Thread t = new Thread(new Runnable(){
@Override
public void run() {
}
});
上面是一行语句来创建一个新的线程。这里我们创建一个 Runnable 作为匿名类。如果你熟悉 lambda 表达式,我们可以用更短的代码创建一个线程。
Runnable runnable = () -> System.out.println("Hello");
一旦创建了线程,我们就必须通过调用start()方法来开始执行它。
runnable.start();
我已经写了很多文章来解释 Java 中的多线程概念。您可以按顺序阅读这些文章,以了解有关多线程、其实际用途、线程生命周期、线程池等的所有信息。
1. Java 线程和 Runnable
这是关于 Thread 类和 Runnable 接口的第一篇文章。您还将了解 Process 和 Thread。Thread 和 Process 之间有什么区别?使用线程的好处以及如何使用 Runnable 接口和 Thread 类创建线程。这篇文章还将 Runnable 接口与 Thread 类进行了比较。
2. Java线程睡眠
Java Thread sleep 用于暂停当前线程的执行。我们将在以后的文章中广泛使用 Thread sleep,因此了解它的工作原理以及它是否准确是很好的。
3. Java 线程连接
有时我们需要等待其他线程完成执行后才能继续。我们可以使用Thread join方法实现这一点,了解它的工作原理以及何时应该使用它。
4. Java线程状态
了解 线程的不同状态 非常重要。了解线程如何改变其状态以及操作系统线程调度程序如何改变线程的状态。
5. Java线程wait,notify和notifyAll
Java Object 类包含三种方法来传达资源的锁定状态。通过简单的 Wait-Notify 实现示例来了解这些 Object 类方法的用法。
6.线程安全和同步
我们知道线程共享对象资源,这可能导致数据损坏,因为这些操作不是原子的。了解如何使用不同的方法在 Java 中实现线程安全。阅读这篇文章以了解同步、同步方法和同步块的正确用法。
7. Java 主线程中的异常
JVM 使用 main 方法创建第一个线程。这篇文章解释了我们在日常生活中看到的一些常见异常,以及它们的根本原因和解决方法。
8.单例类中的线程安全
在本文中,您将学习创建 Singleton 类的基本概念。不同实现的线程安全问题是什么?我们如何在 Singleton 类中实现线程安全。
9. Java中的守护线程
一篇简单的文章,解释守护线程 以及如何在 Java 中创建守护线程。
10. Java 线程本地
我们知道线程共享 Object 的变量,但如果我们想在类级别创建线程局部变量,该怎么办?Java 提供了 ThreadLocal 实用程序类来创建线程局部变量。阅读更多内容,了解如何在 Java 程序中创建 ThreadLocal 变量。
11. Java 线程转储
Java 线程转储 提供当前线程的信息。线程转储对于分析应用程序的性能问题很有用。您可以使用线程转储来查找和修复死锁情况。这篇文章解释了可用于在 Java 中生成线程转储的不同方法。
12.如何分析Java中的死锁
死锁是多个线程相互等待释放资源从而导致循环依赖的情况。本文讨论了 Java 程序中可能出现死锁的情况。如何使用线程转储查找死锁以及避免 Java 程序中出现死锁的最佳实践。
13. Java 计时器线程
这篇文章解释了如何使用 Java Timer 和 TimerTask 类来创建按预定间隔运行的作业,并提供了一个示例程序来展示其用法,以及如何取消计时器。
14. Java生产者消费者问题
在 Java 5 之前,可以使用 wait() 和 notify() 方法解决生产者-消费者问题,但 BlockingQueue 的引入使它变得非常容易。了解如何使用 BlockingQueue 解决 Java 中的生产者-消费者问题。
15. Java线程池
Java 线程池是等待处理作业的工作线程的集合。Java 5 引入了 Executor 框架,使得在 Java 中创建线程池变得非常容易。我们可以使用 Executors 和 ThreadPoolExecutor 类来创建和管理线程池。
16. Java 可调用未来
有时我们希望线程返回一些可以使用的值。在这种情况下可以使用 Java 5 Callable,它类似于 Runnable 接口。我们可以使用 Executor 框架来执行 Callable 任务。
17. Java FutureTask 示例
FutureTask 类是实现 Future 接口的基本具体类。我们将其与 Callable 实现和 Executors 一起使用,以进行异步处理。FutureTask 类提供了实现方法来检查任务的状态,并在任务处理完成后将值返回给调用程序。当您想要覆盖 Future 接口的某些实现方法时,它会派上用场。
结论
多线程是一个非常广泛的主题,不可能在一篇文章中写出所有内容。如果您按顺序阅读上述文章,您将了解有关 Java 中多线程的所有内容。