全干工程师

Java-Logo

Java多线程简介

Java应用程序中的多线程允许多个线程在单个进程中并发运行。线程是独立执行的任务,可以共享数据和其他资源,如文件和网络连接。在本教程中,我们将探讨Java多线程的含义、优点和缺点。

Java中什么是线程?

线程是一种轻量级进程,可由操作系统独立调度。它也被定义为程序中允许代码并发执行的独立执行路径,这意味着多个线程可以同时执行。

每个线程都有自己的堆栈,这意味着它可以拥有局部变量并跟踪自己的执行情况。线程可用于实现并行性,即同时执行多个任务。

Java(和其他编程语言)中,线程共享相同的地址空间,因此可以访问应用程序或程序的所有变量、对象、方法和全局范围。

Java中的多线程是什么?

多线程是指操作系统在同一时间在内存中拥有多个线程的能力,让人误以为所有这些线程都在同时执行。操作系统为每个 "线程 "分配一个特定的时间片,每当它们的时间片到期时,就会在它们之间切换。线程之间的切换过程称为上下文切换。

上下文切换包括:

  • 存储线程状态。
  • 清空 CPU 寄存器。
  • 将 CPU 控制权传递给队列中的下一个线程。

需要注意的是,处理器在任何时候都只能执行一个线程。与运行单线程应用程序相比,当有许多任务等待完成时(如从磁盘读取数据),通过同时启动多个任务,可以获得更好的吞吐量。

Java中多线程的优点是什么?

下面列出了 Java 多线程的一些优势:

  • 提高响应速度
  • 执行速度更快
  • 更好地利用 CPU 和内存
  • 支持并发

多线程的缺点

以下是在 Java 应用程序和软件开发实践中使用线程的缺点:

  • 增加测试和调试方面的难度
  • 增加代码的复杂性

Java中的多线程

Java语言内置了对多线程工作的支持。运行Java应用程序时,Java虚拟机(JVM)会创建一个称为主线程的线程。主线程负责运行应用程序的main()方法。然后,主线程可以创建其他线程,这些线程可以与主线程同时运行。

线程并发执行可以利用多个CPU或处理器,帮助提高应用程序的性能。在用户与图形用户界面(GUI)交互时,允许在后台执行任务,也有助于提高响应速度。

如何用Java进行多线程编程

您可以通过以下方式之一在Java中创建线程:

  • 扩展Thread
  • 实现Runnable接口

Java中扩展Thread类

下面的程序说明了如何通过扩展Thread类在Java中实现多线程:

class MyThreadClass extends Thread {
    public void run()
    {
        try {
            System.out.println(
                "The Current Thread Id is:" + Thread.currentThread().getId());
        }
        catch (Exception ex) {
            System.out.println("An error occurred...");
        }
    }
}
public class MultithreadingDemo {
    public static void main(String[] args)
    {
        for (int i = 0; i < 5; i++) {
            MyThreadClass obj = new MyThreadClass();
            obj.start();
        }
    }
}

在Java中实现Runnable接口

Runnable是一个接口,可用于创建可由线程执行的任务。任务只是一段可由线程运行的代码。你可以把它想象成一个没有返回值、不带参数的方法。

下面的程序展示了如何通过实现Runnable接口在Java中实现多线程:

class MyThreadClass implements Runnable 
{
    public void run()
    {
        try {
           System.out.println("Hello world");
        } catch (Exception ex) {
            System.out.println("An error occurred...");
        }
    }
}
public class MultithreadingDemo {
    public static void main(String[] args)
    {
        for (int i = 0; i < 5; i++) {
            Thread obj = new Thread(new MyThreadClass());
            obj.start();
        }
    }
}

什么是Java中的线程状态?

Java程序启动时,只有一个线程(主线程)。该线程负责执行程序的main()方法。一旦main()方法退出,程序就会终止。不过,Java 程序可以有多个线程同时运行。

线程可以处于以下几种状态之一:

  • Ready or Runnable(准备或可运行),这是线程在就绪或可运行队列中等待分配处理器的状态。调用线程对象的启动方法时,线程会进入这种状态。当运行时隐式调用 yield 方法时,线程会将控制权放弃给就绪或可运行队列中的下一个线程。
  • Running(运行),这是线程被处理器执行的状态。调度程序负责在适当的时候将线程调度到运行状态,通常是在轮到它且当前运行的线程已完成执行之后。
  • Waiting/Suspended/Blocked(等待/暂停/阻塞),调用线程对象的 suspend 方法时,线程会进入暂停状态。调用 resume 方法后,被挂起的线程可以被移回运行状态。线程处于等待状态时会等待 I/O。

当线程完成执行或终止时,它会停止。

Java中的线程优先级和调度

在 Java 中,每个线程都有一个优先级,它是一个整数值,定义了调度程序如何确定线程的优先级。调度程序总是优先执行优先级较高的线程,这意味着它比优先级较低的线程更有可能更快被执行。线程的默认优先级是5。

您可以使用setPriority()方法设置线程的优先级,该方法的参数为 1 到 10 之间的整数。数字越小,优先级越低;因此,优先级为 1 的线程优先级最低,而优先级为 10 的线程优先级最高。下面是一个如何设置线程优先级的示例:

thread.setPriority(5);

当多个线程具有相同的优先级时,它们的执行顺序由创建时间决定(即哪个线程先创建)。这就是所谓的先进先出(FIFO)调度。

总结

创建线程有两种方法:扩展Thread类或实现Runnable接口。尽管多线程有很多优点,但使用时必须谨慎。你应该知道如何处理线程同步问题,避免死锁和竞赛条件。我们将在今后的文章中讨论更多有关多线程的内容。

本文章翻译于multithreading-in-java

留言