大话线程的三种使用方式(这个不知道就与BAT无缘了)
发布日期:2021-06-30 16:13:08 浏览次数:3 分类:技术文章

本文共 1627 字,大约阅读时间需要 5 分钟。

彩蛋提前播放

超神学院语录

我与各位并无冤仇,但,我为爱而战。


在这里插入图片描述

线程的三种使用方式

  • 实现Runnable接口
  • 实现Callable接口
  • 继承Thread接口

实现 RunnableCallable 接口的类只能当做一个可以在线程中运行的任务,不是真正意义上的线程,因此最后还需要通过 Thread 来调用。可以说任务是通过线程驱动从而执行的。

实现Runnable接口

通过实现Runnable接口使用线程,需要先实现Runable接口的run()方法:

public class HelloRunnable implements Runnable {
public void run() {
// 逻辑代码 }}

实现Runable接口的类并不是真正的线程,需要线程对象Thread通过调用start() 方法启动线程。

线程使用方式如下:

public static void main(String[] args) {
HelloRunnable instance = new HelloRunnable(); Thread thread = new Thread(instance); thread.start();}

实现Callable接口

与Runnable接口相比,Callable可以有返回值,返回值通过FutureTask进行封装。

public class HelloCallable implements Callable
{
public Integer call() {
return 999; }}

和Runnable不同,实现Callable的类需要实现call()方法。

使用方式如下:

public static void main(String[] args) throws ExecutionException, InterruptedException {
HelloCallable hc = new HelloCallable(); FutureTask
ft = new FutureTask<>(hc); Thread thread = new Thread(ft); thread.start(); System.out.println(ft.get());}

继承Thread类(不推荐)

与 Runnable相似,需要实现run() 方法,实际上Thread类也继承了Runable接口。

但是不需要声明线程对象去调用start方法,因为继承了Thread类。当调用 start() 方法启动一个线程时,虚拟机会将该线程放入就绪队列中等待被调度,当一个线程被调度时会执行该线程的 run() 方法

声明线程对象:

public class HelloThread extends Thread {
public void run() {
// 逻辑代码 }}

使用线程对象:

public static void main(String[] args) {
HelloThread ht = new HelloThread (); ht.start();}

实现接口与继承Thread

实现接口更推荐使用,因为:

  • Java 不支持多重继承,因此继承了 Thread 类就无法继承其它类,但是可以实现多个接口;
  • 类可能只要求可执行就行,继承整个 Thread 类开销过大。

Runnable接口与Thread之间的关系:

Thread负责线程本身相关的职责与控制,而Runable仅负责逻辑执行的单元,因此继承Thread开销会更大一些。

转载地址:https://keepgoon.blog.csdn.net/article/details/115920448 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:聊一聊线程互斥与同步的那些事(以实例解释synchronized与ReentrantLock)
下一篇:图解: 线程状态转换(线程生命周期这一篇够用了)

发表评论

最新留言

不错!
[***.144.177.141]2024年05月03日 23时43分52秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章