Products
GG网络技术分享 2026-01-23 18:35 4

文章浏览阅读2.3k次。本文介绍了Java中创建多线程的三种方式:继承Thread类实现Runnable接口以及实现Callable接口,并tong过示例详细讲解了每种方式的使用,包括使用Future和FutureTask获取Callable返回值,以及线程池的创建和使用。 吃瓜。 一边,文章提到了线程平安问题及相关的解决方案链接。 学习AI 搜索 消息历史Java并发编程系列07:多线程的实现方式:继承Thread类实现Runnable接口或Callable接口 于 2021-11-29 14:19:48 首次发布 版权
我懂了。 好吧,先冷静一下。你是不是觉得程序跑起来有点慢?huo者你想让用户界面不卡顿? 多线程可Neng是个选择,但它就像一把双刃剑,用不好会让你陷入无尽的死锁和资源竞争之中! 我跟你说有时候单线程就够了别没事瞎折腾。
很棒。 这种方法…嗯…比较古老。直接继承 Thread 类,ran后重写 run 方法。代码kan起来hen简洁,但有个问题就是 Java 不支持多重继承!如guo你Yi经继承了别的类,就没法用这种方法了。而且…我觉得它有点不太优雅。
class MyThread extends Thread {
@Override
public void run {
System.out.println;
}
}
public class Main {
public static void main {
MyThread thread = new MyThread;
thread.start; //启动! 激动吧!
}
}
这是Zui常用的方法! 实现 Runnable 接口,ran后将一个 Runnable 对象传递给 Thread 的构造函数。这样可yi避免多重继承的问题,而且geng灵活! 我个人比较喜欢这种方式。
class MyRunnable implements Runnable {
@Override
public void run {
System.out.println; //这句话hen重要! 你知道吗?你知道吗?!!!?!!?!!?!!?!!?!??!?!?!?!!?!?!?!?!?!!?!?!?!?!?!!!?!?!?!!?!?!?!?!!!!?!?!?!??!?!!!?!?!?!?!!!!!??????!?!!!!!!???!!!!?!?!?!?????????!!!?!?!?!?!?!!!!!?????????????!!!!!!!!!!!!!!!???!!!!!!!!!!!!!!?????????????????????!!!!!!!!!!!!!!!!!!!!!!!!!??!!!!!!!!!!!!!!!!!!??!!!!!??!!??!!!?!?!?!?!?!?!?!?!?!??!??!!!!!!??!!!!!??!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!??!!!!?????!!!!!!!!!!!!!!???!!!!!!!!!!!!!!!???????!!!?????!!!!!!!???????!!!!!??!?!?!?!???!!!!!!!!!!!!!!!????????!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!????!!!!!!????????!!!!!!!!!!!!!!!!!!!!!!!!!!!!!??????!!!?????!!!!!!!?????????!!!!!?!?!?!!????????!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!????????!!!!!!????????!!!!?????!!!!!!!!!!!!?????!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!??????????????!?!!!????????!?!!!!!!!!!!!!!!!!!!!!!?!?!?!?!!!!?!?!??!?!?!؟!؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟¿¡¿¡¿¡¿¡¿¡¿¡¿¡¿¡¿¡ ¿ ¡ ¿ ¡ ¿ ¡ ¿ ¡ ¿ ¡ ¿ ¡ ¿ ¡ ¿ ! ! ! ! ! ! ! ! !!! !!! !!! !!! !!! !!! !!! !!!! !!!!! ?!? ?!? ?!? ?!? ?!? ?!? ?!? ?!?. ?!?. ?!?. ?!?. ?!?. ?!?. ?!?. ?!?. ??? ??? ??? ??? ??? ??? ???? ???? ???? ???? ???? ???? ???? ????? ????? ????? ????? ????? ????? ?? !! !! !! !! !! !! !! ?? ?? ?? ?? ?? ?? ?? ?? ?? ## ## ## ## ## ## ## ### ### ### ### ### ### #### #### #### #### #### #### ##### ##### ##### ##### ##### ##### ###### ###### ###### ###### ###### ###### // 这行代码特bie重要啊!相信我!我相信你也Nengkan到这行字! 我真的信你!
// dan是...你真的理解了吗?
// 我承认...确实有点乱...dan是这就是生活啊! 生活充满了不可预测性啊!
//哎呀,不说了,再说下去我要哲学了...
} } public class Main { public static void main { MyRunnable runnable = new MyRunnable; Thread thread = new Thread; thread.start; } }
表格来啦!
产品 价格 评分 键盘 50元 4.5 鼠标 30元 4.0 显示器 500元 4.8
第三种方式:Callable 和 Future
Callable 接口和 Runnable 接口类似,但它可yi返回一个值bing且可yi抛出异常。 使用 Callable 需要配合 Future 和 FutureTask 使用才Neng获取返回值。 观感极佳。
其实吧...我觉得这玩意儿挺麻烦的...dan是人家说它好用...你就当它好用吧...
import java.util.concurrent.*; class MyCallable implements Callable { @Override public Integer call throws Exception { System.out.println; return 123; } } public class Main { public static void main throws InterruptedException, ExecutionException { MyCallable callable = new MyCallable; ExecutorService executor = Executors.newFixedThreadPool; Future future = executor.submit; Integer result = future.get; System.out.println; executor.shutdown; } }
第四种方式:tong过Executors类的callable静态方法
可yitong过Executors类的callable静态方法,把一个Runable任务转换为Callable任务。 示例:
Callable Object callable = Executors.callable;
第五种方式:竟然还有第六种?!
好吧...其实第六种就是各种各样的框架提供的任务调度机制啦....比如Sprin 心情复杂。 g TaskExecutor....不过那些dou太高级了...今天就不说了...
再说说:guan与线程池
类型 核心数 Zui大数 空闲时间 队列大小 FixedThreadPool 5 10 60秒 LinkedBlockingQueue 无界队列
操作一波... suo以说到底呢...要不要使用多线程取决于你的实际需求...记住要小心死锁和资源竞争哦!祝你好运!
Demand feedback