网站优化

网站优化

Products

当前位置:首页 > 网站优化 >

如何高效创建Java线程,并理解Thread、Runnable、Callable及线程池的使用?

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


Java 并发编程】线程创建 6 种方式:Thread/Runnable/Callable 核心类解析+线程池使用说明

文章浏览阅读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 类

很棒。 这种方法…嗯…比较古老。直接继承 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; //启动! 激动吧! 
    }
}

第二种方式:实现 Runnable 接口

这是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大数空闲时间队列大小
FixedThreadPool51060秒LinkedBlockingQueue 无界队列

操作一波... suo以说到底呢...要不要使用多线程取决于你的实际需求...记住要小心死锁和资源竞争哦!祝你好运!


提交需求或反馈

Demand feedback