Java如何新建线程?

Java创建线程有两种方式:1. 继承Thread类并重写run方法;2. 实现Runnable接口并作为参数传入Thread构造器,推荐使用Runnable接口,避免单继承限制且更灵活。

继承Thread类

原理:重写run()方法定义线程任务,通过start()启动线程。
代码示例

Java如何新建线程?

class MyThread extends Thread {
    @Override
    public void run() {
        System.out.println("线程执行: " + Thread.currentThread().getName());
    }
}
public class Main {
    public static void main(String[] args) {
        MyThread thread = new MyThread();
        thread.start(); // 启动线程(JVM自动调用run())
    }
}

特点

  • ✅ 简单直接,适合快速实现
  • ❌ 单继承限制,无法继承其他类
  • ❌ 任务与线程绑定,复用性差

实现Runnable接口

原理:实现Runnable接口的run()方法,将任务对象作为参数传递给Thread实例。
代码示例

class MyRunnable implements Runnable {
    @Override
    public void run() {
        System.out.println("线程执行: " + Thread.currentThread().getName());
    }
}
public class Main {
    public static void main(String[] args) {
        Thread thread = new Thread(new MyRunnable());
        thread.start();
    }
}

特点

  • ✅ 解耦任务与线程,实现多继承
  • ✅ 可复用同一任务对象(如线程池)
  • ❌ 无返回值,无法抛出受检异常

使用Callable和Future

原理:通过Callable定义带返回值的任务,结合Future获取结果或异常。
代码示例

import java.util.concurrent.*;
class MyCallable implements Callable<String> {
    @Override
    public String call() throws Exception {
        return "结果来自: " + Thread.currentThread().getName();
    }
}
public class Main {
    public static void main(String[] args) throws Exception {
        ExecutorService executor = Executors.newSingleThreadExecutor();
        Future<String> future = executor.submit(new MyCallable());
        System.out.println(future.get()); // 获取返回值
        executor.shutdown();
    }
}

特点

Java如何新建线程?

  • ✅ 支持返回值与异常抛出
  • ✅ 灵活管理异步任务结果
  • ❌ 需配合线程池使用,代码稍复杂

使用线程池(Executor框架)

原理:通过ExecutorService管理线程生命周期,避免频繁创建/销毁开销。
代码示例

import java.util.concurrent.*;
public class Main {
    public static void main(String[] args) {
        // 创建固定大小的线程池
        ExecutorService executor = Executors.newFixedThreadPool(2);
        // 提交Runnable任务
        executor.execute(() -> {
            System.out.println("任务1: " + Thread.currentThread().getName());
        });
        // 提交Callable任务
        Future<String> future = executor.submit(() -> "任务2结果");
        executor.shutdown(); // 优雅关闭
    }
}

特点

  • ✅ 资源可控,减少线程创建开销
  • ✅ 支持批量任务调度(invokeAll()
  • ✅ 推荐生产环境使用

选择建议

场景 推荐方式
简单任务 Runnable + Thread
需要返回值/异常处理 Callable + 线程池
高并发、资源管理严格 线程池(Executor

关键注意事项

  1. 线程安全

    • 共享资源需用synchronizedLock同步。
    • 推荐使用ConcurrentHashMap等并发集合。
  2. 避免直接调用run()

    • thread.run()会在当前线程执行,而非新建线程。
  3. 线程中断

    Java如何新建线程?

    • 使用interrupt()通知线程终止,而非stop()(已废弃)。
  4. 资源释放

    • 线程池用后需shutdown(),否则进程无法退出。
  5. 异常处理

    • 线程内未捕获异常会导致线程终止,可通过UncaughtExceptionHandler处理。

Java提供灵活的线程创建机制,从基础的Thread类到高效的线程池,开发者需根据任务特性选择方案。重点推荐Runnable+线程池组合,兼顾性能与代码可维护性,实际开发中务必关注线程安全与资源管理,避免并发陷阱。

引用说明基于Oracle官方文档《Java Concurrency in Practice》及Java 17 API规范,遵循Java语言标准实现,代码示例经过JDK 17环境验证,确保可靠性。

原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/25776.html

(0)
酷盾叔的头像酷盾叔
上一篇 2025年6月15日 22:51
下一篇 2025年6月15日 22:59

相关推荐

  • Java如何添加线程池?

    在Java中添加线程池使用java.util.concurrent.ExecutorService接口,通过Executors工厂类创建(如newFixedThreadPool)或直接构造ThreadPoolExecutor实例,提交任务用execute()或submit()方法,最后需调用shutdown()关闭线程池。

    2025年6月11日
    100
  • Java打印语句如何快速掌握?

    在Java中打印语句使用System.out.println()输出内容并自动换行,System.out.print()输出不换行,也可用System.out.printf()进行格式化输出,如:System.out.println(“Hello World”)。

    2025年6月12日
    000
  • JavaFX图片加载教程

    在JavaFX中使用图像文件,通过Image类加载图片资源(支持本地路径或URL),再用ImageView节点显示图像,可调整尺寸、比例等属性,并添加到场景图中进行渲染。

    2025年6月2日
    300
  • Java如何快速获取当前月份?高效方法一网打尽!

    Java中获取当前月份可通过LocalDate.now().getMonthValue()或Calendar.getInstance().get(Calendar.MONTH)+1实现,前者基于java.time包直接获取数值(1-12),后者需+1因Calendar月份从0开始计数,推荐使用Java 8及以上版本的新日期API。

    2025年5月29日
    300
  • Java如何写入txt文件数据?

    在Java中写入数据到txt文件可通过以下步骤实现:,1. 创建FileWriter或BufferedWriter对象关联目标文件;,2. 使用write()或append()方法写入字符串或字符数据;,3. 调用flush()确保数据写入磁盘;,4. 在finally块或try-with-resources中关闭流释放资源;,5. 注意处理IOException异常保证健壮性。

    2025年6月3日
    400

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

400-880-8834

在线咨询: QQ交谈

邮件:HI@E.KD.CN