java创建线程的三种方式
发布日期:2021-05-14 00:01:34 浏览次数:25 分类:精选文章

本文共 2432 字,大约阅读时间需要 8 分钟。

Java 创建线程的三种方式

在Java编程中,创建线程有三种主要方式,这些方法各有侧重,适用于不同的场景。我将从这些方法的基本概念出发,逐一探讨它们的实现过程。


一、通过继承 Thread 类本身

要使用这种方法,我们需要定义一个继承自 Thread 类的子类,并重写父类 Thread 中的 run() 方法。这种方法简单直接,但需要注意以下几点:

  • 定义子类继承 Thread 类

    public class Demo1 extends Thread {    public void run() {        System.out.println("子线程:" + getName() + "正在运行...");    }}
  • 在主类中创建子类对象并启动线程

    public static void main(String[] args) {    Demo1 demo1 = new Demo1();    Demo1 demo2 = new Demo1();    demo1.start();    demo2.start();}

    注意,一旦线程启动,JVM会立即创建新的线程执行 run() 方法,而start() 方法将线程标记为“即将运行”状态。


  • 二、通过实现 Runnable 接口

    当需要使用更灵活的线程实现方式时,可以使用 Runnable 接口。这种方式允许线程类继承自其他类(而无需继承 Thread 类),更具灵活性。具体步骤如下:

  • 定义实现 Runnable 接口的子类

    public class ImpRunnable implements Runnable {    private int i;    public void run() {        for (; i < 50 ; i++) {            System.out.println(Thread.currentThread().getName() + ":" + i);        }    }}
  • 在主类中创建 Runnable 实例并启动线程

    public static void main(String[] args) {    Runnable target = new ImpRunnable();    // 创建并启动线程    Thread thread1 = new Thread(target, "线程1");    Thread thread2 = new Thread(target, "线程2");    thread1.start();    thread2.start();}
  • 注意事项

    • start() 方法必须被明确调用,否则 run() 方法不会自动执行。
    • 无法调用 run() 方法直接启动线程,必须通过 start() 走启。

  • 三、通过 Callable 和 Future 创建线程

    这种方法允许线程拥有返回值,适用于需要异步计算并获取结果的场景。具体步骤如下:

  • 创建 Callable 接口实现类

    public class CallableThreadTest implements Callable {    public Integer call() {        int i = 0;        for (; i < 100 ; i++) {            System.out.println(Thread.currentThread().getName() + ":" + i);        }        return i;    }}
  • 包装 Callable 对象到 FutureTask

    CallableThreadTest ctt = new CallableThreadTest();FutureTask
    ft = new FutureTask<>(ctt);
  • 在主类中启动线程并获取返回值

    public static void main(String[] args) {    CallableThreadTest ctt = new CallableThreadTest();    FutureTask
    ft = new FutureTask<>(ctt); // 创建并启动线程 Thread worker = new Thread(ft, "有返回值的线程"); worker.start(); // 等待线程执行并获取结果 try { String result = ft.get(); System.out.println("子线程返回结果:" + result); } catch (InterruptedException | ExecutionException e) { e.printStackTrace(); }}
  • 注意事项

    • 使用 get() 方法会阻塞当前线程,直到子线程完成。
    • 需要处理可能的异常,包括 InterruptedExceptionExecutionException

  • 三种方式的对比分析

    • Runnable 和 Callable:相同点:不需要继承 Thread 类,可以继承其他类。不同点:Runnable 接口不返回值,而 Callable 接口可以返回值。选择 Runeable 或 Callable 取决于是否需要获取线程执行结果。

    • 继承 Thread 类的方式:简单易懂,但功能较为基础,难以进行任务中介或与其他线程协作时的灵活运用。


    通过以上方法,我们可以根据具体需求选择合适的线程创建方式。无论哪种方式,最终目标都是实现多线程程序的高效运行。

    上一篇:Word查找和替换通配符
    下一篇:java多线程相关的基本概念

    发表评论

    最新留言

    不错!
    [***.144.177.141]2025年05月08日 15时18分46秒

    关于作者

        喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
    -- 愿君每日到此一游!

    推荐文章