The difference beteen two way

总所周知,Java实现多线程有两种方式,分别是继承Thread类和实现Runable接口,那么它们的区别是什么?

继承 Thread 类:

通过继承 Thread 类,你可以创建一个直接表示线程的类。你可以覆盖 Thread 类中的 run 方法来定义线程的逻辑。当调用 start 方法启动线程时,会执行该类中的 run 方法。

优点:简单直观,可以直接访问线程的方法和属性。

缺点:由于 Java 不支持多重继承,因此如果你的类已经继承了其他类,就无法再继承 Thread 类。此外,由于继承是一种静态的方式,它限制了类的扩展性。

实现 Runnable 接口:

通过实现 Runnable 接口,你可以将线程的逻辑封装在一个独立的类中。这个类只需要实现 Runnable 接口中的 run 方法。然后,你可以将该类的实例传递给 Thread 对象,并调用 start 方法启动线程。

优点:避免了单继承的限制,提高了代码的灵活性和可维护性。可以在多个类中共享同一个线程对象。

缺点:在访问线程的方法和属性时需要通过 Thread 对象来间接访问。

总结:

还是实现 Runnable 比较好,代码比较灵活,避免了单继承的局限性,最重要的是可以在多个类中共享线程对象

Method receiving parameters within a thread

Defind a Sub Thread

public class MyRunnable implements Runnable {
private String parameter; public MyRunnable(String parameter) {
this.parameter = parameter;
} @Override
public void run() {
// 在这里编写子线程的逻辑,可以使用参数 parameter
System.out.println("子线程执行,参数为:" + parameter);
}
}

Main Thread to call Sub Thread

// 在主线程中创建并启动子线程
public class MainThread {
public static void main(String[] args) {
String parameter = "Hello, World!";
Thread thread = new Thread(new MyRunnable(parameter));
thread.start(); // 主线程继续执行其他操作
System.out.println("主线程继续执行");
}
}

在上面的示例中,我们定义了一个实现了 Runnable 接口的类 MyRunnable。该类的构造函数接收一个参数,并将其保存在成员变量 parameter 中。在 run 方法中,我们可以使用该参数执行子线程的逻辑。

然后,在主线程中,我们创建了一个子线程,并将 MyRunnable 对象作为参数传递给 Thread 构造函数。通过调用 start 方法来启动子线程。

Method return parameters within a thread

在 Java 中,Runnable 接口本身并不支持直接返回值。它的 run 方法没有定义返回值。然而,你可以通过get方式来实现在 Runnable 实例中获取返回值的效果。

下面是一个示例,展示了如何通过自定义类来实现在 Runnable 接口中获取返回值的功能:

public class MyRunnable implements Runnable {
private int result; public int getResult() {
return result;
} @Override
public void run() {
// 执行耗时操作,计算结果
result = performCalculation();
} private int performCalculation() {
// 在这里执行具体的计算逻辑
// ...
return 42; // 假设计算结果为 42
}
}

main

public class MainThread {
public static void main(String[] args) {
MyRunnable runnable = new MyRunnable();
Thread thread = new Thread(runnable);
thread.start(); // 等待子线程执行完成
try {
thread.join();
} catch (InterruptedException e) {
e.printStackTrace();
} // 获取子线程的返回值
int result = runnable.getResult();
System.out.println("子线程的返回值为: " + result);
}
}

在上述示例中,MyRunnable 类实现了 Runnable 接口,并在其内部定义了一个 result 变量用于保存计算结果。在 run 方法中,你可以执行耗时的计算操作,并将结果赋值给 result 变量。

在主线程中,我们创建了一个 MyRunnable 实例,并将其传递给 Thread 构造函数。通过调用 start 方法启动线程后,我们使用 join 方法等待子线程执行完成。

最后,我们通过调用 getResult 方法获取子线程的计算结果,并打印输出。

请注意,这种方式是通过自定义类来实现从子线程中获取返回值的效果,并不是直接使用 Runnable 接口本身的特性。

线程方法接收参数和返回参数,Java的两种线程实现方式对比的更多相关文章

  1. java的两种线程

    java中的两种线程     守护线程与用户线程 守护线程:就是服务于用户线程的线程,例如垃圾回收的线程及时最典型的守护线程.不需要上层逻辑的介入 用户线程:就是程序自己创建的线程 守护线程; 守护线 ...

  2. Java中两种实现多线程方式的对比分析

    本文转载自:http://www.linuxidc.com/Linux/2013-12/93690.htm#0-tsina-1-14812-397232819ff9a47a7b7e80a40613cf ...

  3. 返回Json和XML两种格式

    由于项目需要,同一接口支持根据参数不同返回XML和Json两种格式的数据,在网上看了很多大多是加后缀的方式来实现返回不同格式数据的,后来看了一篇http://www.importnew.com/276 ...

  4. 【Python笔记】2020年7月22日练习=[定义一个函数quadratic(a, b, c),接收3个参数,返回一元二次方程的两个解]

    学习教程:廖雪峰-Python教程-函数-函数定义 学习记录:[定义一个函数quadratic(a, b, c),接收3个参数,返回一元二次方程的两个解] 学习心得: 1.对问题进行判断分析后再下手. ...

  5. Java并发编程:Java的四种线程池的使用,以及自定义线程工厂

    目录 引言 四种线程池 newCachedThreadPool:可缓存的线程池 newFixedThreadPool:定长线程池 newSingleThreadExecutor:单线程线程池 newS ...

  6. JAVA 中两种判断输入的是否是数字的方法__正则化_

    JAVA 中两种判断输入的是否是数字的方法 package t0806; import java.io.*; import java.util.regex.*; public class zhengz ...

  7. 牛客网Java刷题知识点之Map的两种取值方式keySet和entrySet、HashMap 、Hashtable、TreeMap、LinkedHashMap、ConcurrentHashMap 、WeakHashMap

    不多说,直接上干货! 这篇我是从整体出发去写的. 牛客网Java刷题知识点之Java 集合框架的构成.集合框架中的迭代器Iterator.集合框架中的集合接口Collection(List和Set). ...

  8. Java多线程--两种实现方式

    进程概述: 在这之前,有必要了解一下什么是进程? 在一个操作系统中,每个独立的执行的程序都可称为一个进程,也就是"正在运行的程序".如图所示: 线程概述: 如上所述,每个运行的程序 ...

  9. AsyncTask两种线程池

        AsyncTask两种线程池  http://bbs.51cto.com/thread-1114378-1.html (API 3.0以后): 1.THREAD_POOL_EXECUTOR, ...

  10. Java中String两种不同创建方式的区别及intern的用法

    一, Java有两种创建字符串的方式, String str1 = "abc"; String str2 = new String("abc"); 用双引号创建 ...

随机推荐

  1. vue全家桶进阶之路36:Vue3 全局路由useRouter和本地路由useRoute

    在 Vue.js 3.x 中,我们可以使用 useRouter 和 useRoute 来获取当前路由对象和当前路由信息. useRouter useRouter 可以用来获取当前路由对象.我们可以通过 ...

  2. python 之路,致那些年,我们依然没搞明白的编码

    摘自:金角大王https://www.cnblogs.com/alex3714/articles/7550940.html 本节内容 编码回顾 编码转换 Python的bytes类型 编码回顾 在备编 ...

  3. 安装Visio 2016与原本的office冲突的最终解决方案

    一. 下载office visio 2016 二. 开始安装 但是提示卸载原本的office 三. 网上找寻答案 于是按照这篇文章https://jingyan.baidu.com/article/1 ...

  4. 泰裤辣!!!手摸手教学,如何训练一个你的专属AI歌姬~

    最近在做AIGC的项目,不过是与图片相关的,现在的模型效果可比前几年图片替换效果好多了.之前尝试过用 faceswap 工具来进行人脸替换的,具体可以参看下我之前的这篇文章:https://blog. ...

  5. python学习之-------OS 文件夹和文件操作

    # OS模块 :查看一个文件夹下所有文件,这个文件夹有文件夹,不能用walk# -- coding: UTF-8 --import osimport sys#C:\Users\Administrato ...

  6. 浙大Jarvisoj [XMAN]level6 Writeup

    分析代码 初始化 0x0804A2EC:保存malloc(0xC10)返回的指针 malloc(0xC10) 0 1 ... ... value note 总数:256 已使用 note 数 0 一. ...

  7. SQL Server 日志传输还原作业执行缓慢

    目录 情景 故障定位 VLF 对 Restore 的影响 问题 解决方案 方案1 方案 2 参考资料 情景 IP 角色 192.168.1.61 Primary 192.168.1.59 Second ...

  8. 【Rust-book】第五章 使用结构体来组织相关联的数据

    第五章 使用结构体来组织相关联的数据 结构,或者结构体,是一种自定义数据类型,它允许我们命名多个相关的值并将它们组成一个有机的结合体. 可以把结构体视作对象中的数据属性 1 对比元组和结构体之间的异同 ...

  9. 5步带你玩转SpringBoot自定义自动配置那些知识点

    目前SpringBoot框架真的深受广大开发者喜爱,毕竟它最大的特点就是:快速构建基于Spring的应用程序的框架,而且它提供了各种默认的功能和配置,可以让开发者快速搭建应用程序的基础结构. 但是,当 ...

  10. Java 统计大串中小串出现的次数 举例:在字符串"woaijavawozhenaijavawozhendeaijavawozhendehenaijavaxinbuxinwoaijavagun"中java出现了5次

    代码如下: public static void main(String[] args) { //大串 String max = "woaijavawozhenaijavawozhendea ...