Java中的多线程 – 你必须知道的一切

当我们运行现实世界中的应用程序时,我们使用优秀的处理器来加快执行速度。但是,仅有处理器速度并不能使您的应用程序运行得更快。创建性能高效的应用程序的一个重要方法是利用多线程。

什么是多线程?

多线程是一种编程概念,应用程序可以创建一小部分任务并行执行。如果您正在使用计算机,它会运行多个应用程序并为它们分配处理能力。简单的程序按顺序运行,代码语句逐一执行。这是一个单线程应用程序。但是,如果编程语言支持创建多个线程并将它们传递给操作系统以并行运行,这就是多线程。

多线程与多进程

当我们谈论多线程时,我们不在乎机器是2核处理器还是16核处理器。我们的工作是创建一个多线程应用程序,让操作系统处理分配和执行部分。简而言之,多线程与多进程无关。

Java如何支持多线程?

Java对多线程应用有很好的支持。Java通过Thread类来支持多线程。Java Thread允许我们创建一个轻量级进程来执行一些任务。我们可以在程序中创建多个线程并启动它们。Java运行时会负责创建机器级指令,并与操作系统协作以并行执行它们。

有哪些不同类型的线程?

一个应用程序中有两种类型的线程 – 用户线程守护线程。当我们启动一个应用程序时,main是第一个创建的用户线程。我们可以创建多个用户线程以及守护线程。当所有用户线程执行完毕时,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();

I have written a lot of posts explaining the concepts of multithreading in Java. You can go through these in sequence to learn everything about multithreading, its real-life usage, thread lifecycle, thread pool, etc.

1. Java 线程和 Runnable

这是关于Thread类和Runnable接口的第一篇帖子。您还将了解到有关进程和线程的知识。线程和进程之间有什么区别?使用线程的好处以及我们如何使用Runnable接口和Thread类创建线程。本帖还将比较使用Runnable接口和Thread类。

2. Java线程睡眠

Java线程睡眠用于暂停当前线程的执行。在未来的帖子中,我们将广泛使用线程睡眠,因此了解它的工作原理以及是否准确是很好的。

3. Java线程加入

有时我们需要等待其他线程完成执行,然后才能继续。我们可以使用Thread的join方法来实现这一点,了解它的工作原理以及何时应该使用它。

4. Java 线程状态

了解线程的不同状态是重要的。学习线程如何改变其状态以及操作系统线程调度程序如何更改线程状态。

5. Java 线程等待、通知和通知全部

Java Object 类包含三个方法,用于通信资源的锁定状态。通过示例了解在简单的等待-通知实现中使用这些 Object 类方法。

6. 线程安全与同步

我们知道,线程共享对象资源,这可能导致数据损坏,因为这些操作不是原子的。了解我们如何使用不同的方法在Java中实现线程安全。阅读本文以了解正确使用同步、同步方法和同步块的方法。

7. Java主线程异常

JVM使用main方法创建第一个线程。本文解释了我们在日常生活中遇到的一些常见异常及其根本原因以及如何修复它们。

8. 单例类中的线程安全性

在本文中,您将了解创建单例类的基本概念。不同实现中存在哪些线程安全性问题?我们如何实现单例类的线程安全性。

9. Java中的守护线程

A simple article explaining daemon threads and how we can create daemon threads in java.

10. Java线程局部变量

我们知道线程共享对象的变量,但如果我们想要在类级别创建线程局部变量呢?Java提供了ThreadLocal实用类来创建线程局部变量。阅读更多了解如何在Java程序中创建ThreadLocal变量。

11. Java线程转储

Java线程转储提供当前线程的信息。线程转储对于分析应用程序的性能问题非常有用。您可以使用线程转储来查找和修复死锁情况。本文介绍了在Java中生成线程转储的不同方法。

12. 如何分析Java中的死锁

死锁是多个线程相互等待对方释放资源而导致循环依赖的情况。本文讨论了在Java程序中可能出现死锁的情况,以及如何使用线程转储来查找死锁,以及在Java程序中避免死锁的最佳实践。

13. Java计时器线程

本文解释了如何使用Java计时器和TimerTask类来创建定时运行的任务,以及展示了其用法的示例程序,以及如何取消计时器。

14. Java生产者消费者问题

在Java 5之前,可以使用wait()和notify()方法解决生产者-消费者问题,但引入了BlockingQueue后,这变得非常容易。学习如何在Java中使用BlockingQueue来解决生产者消费者问题。

15. Java线程池

Java线程池是一组等待处理任务的工作线程集合。Java 5引入的Executor框架使得在Java中创建线程池变得非常容易。我们可以使用Executors和ThreadPoolExecutor类来创建和管理线程池。

16. Java Callable和Future

有时候我们希望我们的线程能够返回一些值,以便我们可以使用它们。在这种情况下,Java 5的Callable接口可以派上用场,它类似于Runnable接口。我们可以使用Executor框架来执行Callable任务。

17. Java FutureTask 示例

FutureTask 类是实现 Future 接口的基本具体类。我们将其与 Callable 实现和 Executors 一起使用,进行异步处理。FutureTask 类提供了实现方法来检查任务的状态,并在其处理完成后将值返回给调用程序。当您想要重写 Future 接口的一些实现方法时,它会很方便。

结论

多线程是一个非常广泛的主题,无法在一篇文章中写出关于它的所有内容。如果您按顺序阅读上述文章,您将了解 Java 中的多线程的所有内容。

Source:
https://www.digitalocean.com/community/tutorials/multithreading-in-java