如何在 Java 中创建线程?

2025 年 3 月 28 日 | 阅读 6 分钟

多线程是 Java 编程中的一个基本概念,它允许开发人员在单个程序中并发执行多个任务。线程是运行在更大进程上下文中的轻量级进程,能够有效地利用系统资源并提高应用程序的响应能力。在本节中,我们将探讨如何在 Java 中创建线程,涵盖各种方法和最佳实践。

在 Java 中,线程由 Thread 类的实例表示,或者通过实现 Runnable 接口来创建。Thread 类提供了内置的多线程支持,而 Runnable 接口定义了一个名为 run() 的单个方法,其中包含线程要执行的代码。通过实现 Runnable 接口,我们可以将任务与线程本身分离开来,从而促进更好的代码组织和可重用性。

在 Java 中创建线程的两种方式如下:

  • 通过继承 Thread 类
  • 通过实现 Runnable 接口

Thread 类

在 Java 中创建线程的最简单方法是继承 Thread 类并重写其 run() 方法。Thread 类提供了构造函数和方法来创建和操作线程。Thread 类继承自 Object 类并实现了 Runnable 接口。

Thread 类的构造函数

  • Thread()
  • Thread(String name)
  • Thread(Runnable r)
  • Thread(Runnable r, String name)

Thread 类的方法

  1. public void run(): 用于为线程执行操作。
  2. public void start(): 启动线程的执行。JVM 调用线程上的 run() 方法。
  3. public void sleep(long miliseconds): 使当前正在执行的线程休眠(暂时停止执行)指定的毫秒数。
  4. public void join(): 等待线程终止。
  5. public void join(long miliseconds): 等待线程在指定的毫秒数内终止。
  6. public int getPriority(): 返回线程的优先级。
  7. public int setPriority(int priority): 更改线程的优先级。
  8. public String getName(): 返回线程的名称。
  9. public void setName(String name): 更改线程的名称。
  10. public Thread currentThread(): 返回当前正在执行的线程的引用。
  11. public int getId(): 返回线程的 ID。
  12. public Thread.State getState(): 返回线程的状态。
  13. public boolean isAlive(): 测试线程是否处于活动状态。
  14. public void yield(): 使当前正在执行的线程对象暂时暂停,允许其他线程执行。
  15. public void suspend(): 用于挂起线程(已弃用)。
  16. public void resume(): 用于恢复挂起的线程(已弃用)。
  17. public void stop(): 用于停止线程(已弃用)。
  18. public boolean isDaemon(): 测试线程是否为守护线程。
  19. public void setDaemon(boolean b): 将线程标记为守护线程或用户线程。
  20. public void interrupt(): 中断线程。
  21. public boolean isInterrupted(): 测试线程是否已被中断。
  22. public static boolean interrupted(): 测试当前线程是否已被中断。

通过实现 Runnable 接口

在 Java 中创建线程的另一种方法是实现 Runnable 接口。任何实例旨在由线程执行的类都应实现 Runnable 接口。Runnable 接口只有一个名为 run() 的方法。当我们要将任务与线程本身分离开来时,首选此方法,它有助于提高封装性和灵活性。

public void run(): 用于为线程执行操作。

启动线程

Thread 类的 start() 方法用于启动新创建的线程。它执行以下任务:

  • 新线程启动(具有新的调用栈)。
  • 线程从“新建”状态转变为“可运行”状态。
  • 当线程有机会执行时,其目标 run() 方法将被运行。

线程创建

1) 通过继承 Thread 类创建线程

文件名:Multi.java

输出

thread is running...

在此示例中,我们通过继承 Thread 类并重写 run() 方法来实现我们的所需功能来定义自定义线程。然后,我们实例化该线程并调用其 start() 方法来开始执行。

2) 通过实现 Runnable 接口的 Java 线程示例

文件名: Multi3.java

输出

thread is running...

在此示例中,我们定义了一个实现 Runnable 接口的类 MyRunnable,并在其 run() 方法中提供了任务逻辑。然后,我们创建一个新的 Thread 对象,将其 MyRunnable 的实例传递给其构造函数,并通过 start() 方法启动线程。

如果我们没有继承 Thread 类,则类对象不会被视为线程对象。因此,我们需要显式创建 Thread 类对象。我们正在传递实现 Runnable 的类的对象,以便可以执行该类的 run() 方法。

3) 使用 Thread 类:Thread(String Name)

我们可以直接使用 Thread 类来创建新线程,并使用上面定义的构造函数。

文件名: MyThread1.java

输出

My first thread

4) 使用 Thread 类:Thread(Runnable r, String name)

观察下面的程序。

文件名: MyThread2.java

输出

My new thread
Now the thread is running ...

在 Java 中创建线程 MCQ

1. 以下哪种是 Java 中创建线程的正确方法?

  1. 实现 Runnable 接口
  2. 继承 Thread 类
  3. a 和 b 都是
  4. d) Neither a nor b
 

答案:c

解释:在 Java 中,我们可以通过实现 Runnable 接口或继承 Thread 类来创建线程。


2. 实现 Runnable 接口时必须重写哪个方法?

  1. start()
  2. run()
  3. init()
  4. execute()
 

答案:b

解释:实现 Runnable 接口时,必须重写 run() 方法以定义构成新线程任务的代码。


3. 使用 Runnable 接口启动线程的正确顺序是什么?

  1. a) 创建 Thread 类实例并调用 start()
  2. b) 直接调用 run() 方法
  3. c) 创建 Runnable 类实例并调用 start()
  4. d) 创建 Thread 类实例并调用 run()
 

答案:a

解释:要使用 Runnable 接口启动线程,您需要创建 Thread 类的实例,将 Runnable 对象传递给其构造函数,然后调用 start() 方法。


4. 调用 start() 方法时线程处于什么状态?

  1. 新建
  2. Runnable
  3. 运行中 (Running)
  4. 等待
 

答案:b

解释:当对线程调用 start() 方法时,它会从“新建”状态转变为“可运行”状态,使其有资格被线程调度器运行。


5. 如何在 Java 中创建守护线程?

  1. a) 通过在线程对象上调用 setDaemon(true) 方法
  2. b) 通过重写 run() 方法
  3. c) 通过继承 Thread 类
  4. d) 通过实现 Runnable 接口
 

答案:a

解释:在 Java 中,守护线程可以通过在启动线程对象之前调用其 setDaemon(true) 方法来创建。


下一主题线程调度器