java中创建线程主要有两种核心方式:继承thread类和实现runnable接口;2. 继承thread类需重写run()方法,通过start()方法启动线程,但受限于java单继承机制;3. 实现runnable接口更灵活,避免单继承限制,实现任务与线程的解耦,便于任务复用和资源共享;4. 更推荐使用实现runnable接口的方式,因其符合“组合优于继承”的设计原则,提升代码复用性和设计弹性;5. 现代java并发编程中应优先使用线程池(executorservice),它通过复用线程降低资源消耗、提高响应速度、统一管理线程、防止资源耗尽,并支持callable和future等高级功能;6. 必须调用start()方法而非直接调用run(),因为start()会触发jvm注册线程、分配资源并交由操作系统调度,从而真正启动新线程并发执行,而直接调用run()仅在当前线程中顺序执行,不创建新线程。
Java中创建和启动线程,主要有两种核心方式:一种是继承
Thread
Runnable
在Java里,让你的程序具备多任务并行处理的能力,也就是线程,其实并不复杂。我们通常会用到两种主要途径,当然,更现代、更健壮的方案会涉及到线程池。
方法一:继承Thread
立即学习“Java免费学习笔记(深入)”;
这是最直观的方式,你直接创建一个类,让它继承自
java.lang.Thread
run()
run()
class MyThread extends Thread { @Override public void run() { System.out.println("我是通过继承Thread类创建的线程,正在执行中..."); try { Thread.sleep(1000); // 模拟耗时操作 } catch (InterruptedException e) { Thread.currentThread().interrupt(); // 重新设置中断状态 System.out.println("MyThread被中断了。"); } System.out.println("MyThread执行完毕。"); } } // 启动方式 public class ThreadCreationDemo { public static void main(String[] args) { MyThread thread1 = new MyThread(); thread1.start(); // 调用start()方法启动线程 System.out.println("主线程继续执行..."); } }
这种方式简单明了,但有个明显的局限:Java是单继承的语言,一旦你继承了
Thread
方法二:实现Runnable
我个人更推荐这种方式,因为它更加符合“面向接口编程”的设计理念,也更灵活。你创建一个类,实现
java.lang.Runnable
run()
Runnable
Thread
Thread
class MyRunnable implements Runnable { private String taskName; public MyRunnable(String taskName) { this.taskName = taskName; } @Override public void run() { System.out.println(taskName + ":我是通过实现Runnable接口创建的线程,正在执行中..."); try { Thread.sleep(1500); // 模拟耗时操作 } catch (InterruptedException e) { Thread.currentThread().interrupt(); System.out.println(taskName + "被中断了。"); } System.out.println(taskName + "执行完毕。"); } } // 启动方式 public class RunnableCreationDemo { public static void main(String[] args) { MyRunnable runnable1 = new MyRunnable("任务A"); Thread thread2 = new Thread(runnable1); // 将Runnable实例传递给Thread构造器 thread2.start(); MyRunnable runnable2 = new MyRunnable("任务B"); Thread thread3 = new Thread(runnable2); thread3.start(); System.out.println("主线程继续执行,等待其他线程完成..."); } }
实现
Runnable
MyRunnable
更现代的方式:使用线程池(ExecutorService
在实际项目中,我们很少会直接手动创建和启动大量的
Thread
java.util.concurrent
ExecutorService
import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.concurrent.Callable; // 示例:使用Callable获取结果 class MyCallable implements Callable<String> { private String name; public MyCallable(String name) { this.name = name; } @Override public String call() throws Exception { System.out.println(name + ":我是通过Callable创建的任务,正在执行..."); Thread.sleep(2000); return name + "任务执行完毕,返回结果。"; } } public class ThreadPoolDemo { public static void main(String[] args) throws Exception { // 创建一个固定大小的线程池,例如2个线程 ExecutorService executor = Executors.newFixedThreadPool(2); // 提交Runnable任务 executor.submit(new MyRunnable("池中任务1")); executor.submit(new MyRunnable("池中任务2")); // 提交Callable任务并获取Future Future<String> futureResult = executor.submit(new MyCallable("池中任务3")); System.out.println("主线程提交任务后继续执行..."); // 获取Callable任务的结果(会阻塞直到任务完成) System.out.println("获取任务3结果:" + futureResult.get()); // 关闭线程池,不再接受新任务,等待已提交任务完成 executor.shutdown(); System.out.println("线程池已关闭。"); } }
线程池是管理和复用线程的利器,它能够有效控制并发线程的数量,避免资源耗尽,并提供更高级的任务提交和结果获取机制(如
Callable
Future
这是个非常经典的问题,也是初学者常常会感到困惑的地方。简单来说,如果你直接调用
run()
而
start()
Thread
start()
start()
start()
run()
所以,
start()
run()
这个问题在实际开发中经常会遇到,我的建议是:优先选择实现Runnable
这并非绝对,但从设计原则和工程实践的角度来看,
Runnable
Thread
Runnable
Runnable
Runnable
Thread
Thread
Runnable
Runnable
Runnable
Thread
Thread
Thread
Runnable
Runnable
Thread
Thread
当然,继承
Thread
Runnable
在现代Java并发编程中,直接手动创建和管理
Thread
java.util.concurrent
ExecutorService
ExecutorService
Runnable
Callable
Future
总之,线程池是构建健壮、高性能并发应用的关键组件。它将线程的生命周期管理与业务逻辑解耦,让开发者能够更专注于业务本身的实现,而不是底层线程的细节。
以上就是java怎样实现线程的创建与启动 java线程创建启动的实用操作方法的详细内容,更多请关注php中文网其它相关文章!
java怎么学习?java怎么入门?java在哪学?java怎么学才快?不用担心,这里为大家提供了java速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 //m.sbmmt.com/ All Rights Reserved | php.cn | 湘ICP备2023035733号