
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();FutureTaskft = new FutureTask<>(ctt);
在主类中启动线程并获取返回值:
public static void main(String[] args) { CallableThreadTest ctt = new CallableThreadTest(); FutureTaskft = 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()
方法会阻塞当前线程,直到子线程完成。 - 需要处理可能的异常,包括
InterruptedException
和ExecutionException
。
三种方式的对比分析
Runnable 和 Callable:相同点:不需要继承 Thread 类,可以继承其他类。不同点:Runnable 接口不返回值,而 Callable 接口可以返回值。选择 Runeable 或 Callable 取决于是否需要获取线程执行结果。
继承 Thread 类的方式:简单易懂,但功能较为基础,难以进行任务中介或与其他线程协作时的灵活运用。
通过以上方法,我们可以根据具体需求选择合适的线程创建方式。无论哪种方式,最终目标都是实现多线程程序的高效运行。
发表评论
最新留言
不错!
[***.144.177.141]2025年05月08日 15时18分46秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
MacType Decency 项目常见问题解决方案
2025-04-11
mac上多个svn版本_where命令
2025-04-11
Mac下IDEA更换Maven仓库
2025-04-11
Mac下MySQL 报错:Error1045(28000)解决办法
2025-04-11
mac下PyCharm导入第三方包
2025-04-11
Mac下redis安装和启动
2025-04-11
Mac下可用的sublime3
2025-04-11
Mac下各种网络命令的使用
2025-04-11
Mac下如何配置环境变量
2025-04-11
Mac下安装jdk
2025-04-11
Mac下安装PEAR
2025-04-11
Mac下安装PIL库
2025-04-11
mac下安装配置nginx
2025-04-11
MAC下安装配置Tomcat
2025-04-11
Mac下忘记MySQL密码可以这样做!
2025-04-11
Mac下显示\隐藏所有文件
2025-04-11
mac下编译openjdk8?so easy!
2025-04-11
mac下配置PrintAssembly
2025-04-11
Mac下配置多个SSH-Key (gitLab)
2025-04-11
mac下面有epoll?
2025-04-11