线程方法接收参数和返回参数,Java的两种线程实现方式对比
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的两种线程实现方式对比的更多相关文章
- java的两种线程
java中的两种线程 守护线程与用户线程 守护线程:就是服务于用户线程的线程,例如垃圾回收的线程及时最典型的守护线程.不需要上层逻辑的介入 用户线程:就是程序自己创建的线程 守护线程; 守护线 ...
- Java中两种实现多线程方式的对比分析
本文转载自:http://www.linuxidc.com/Linux/2013-12/93690.htm#0-tsina-1-14812-397232819ff9a47a7b7e80a40613cf ...
- 返回Json和XML两种格式
由于项目需要,同一接口支持根据参数不同返回XML和Json两种格式的数据,在网上看了很多大多是加后缀的方式来实现返回不同格式数据的,后来看了一篇http://www.importnew.com/276 ...
- 【Python笔记】2020年7月22日练习=[定义一个函数quadratic(a, b, c),接收3个参数,返回一元二次方程的两个解]
学习教程:廖雪峰-Python教程-函数-函数定义 学习记录:[定义一个函数quadratic(a, b, c),接收3个参数,返回一元二次方程的两个解] 学习心得: 1.对问题进行判断分析后再下手. ...
- Java并发编程:Java的四种线程池的使用,以及自定义线程工厂
目录 引言 四种线程池 newCachedThreadPool:可缓存的线程池 newFixedThreadPool:定长线程池 newSingleThreadExecutor:单线程线程池 newS ...
- JAVA 中两种判断输入的是否是数字的方法__正则化_
JAVA 中两种判断输入的是否是数字的方法 package t0806; import java.io.*; import java.util.regex.*; public class zhengz ...
- 牛客网Java刷题知识点之Map的两种取值方式keySet和entrySet、HashMap 、Hashtable、TreeMap、LinkedHashMap、ConcurrentHashMap 、WeakHashMap
不多说,直接上干货! 这篇我是从整体出发去写的. 牛客网Java刷题知识点之Java 集合框架的构成.集合框架中的迭代器Iterator.集合框架中的集合接口Collection(List和Set). ...
- Java多线程--两种实现方式
进程概述: 在这之前,有必要了解一下什么是进程? 在一个操作系统中,每个独立的执行的程序都可称为一个进程,也就是"正在运行的程序".如图所示: 线程概述: 如上所述,每个运行的程序 ...
- AsyncTask两种线程池
AsyncTask两种线程池 http://bbs.51cto.com/thread-1114378-1.html (API 3.0以后): 1.THREAD_POOL_EXECUTOR, ...
- Java中String两种不同创建方式的区别及intern的用法
一, Java有两种创建字符串的方式, String str1 = "abc"; String str2 = new String("abc"); 用双引号创建 ...
随机推荐
- y总算法基础课+算法提高课+算法进阶课超全模板
y总超全算法模板 y总模板自取 喜欢的可以点个赞支持一下^-^ 模板展示
- pyhton 自动化进阶学习1 合并excel 报表,然后进行的透视表操作
import xlrd import xlsxwriter import osimport pandas as pdimport numpy as np# 对合并报表进行透视# 待续# 获取文件夹所有 ...
- 在C++中,传值还是传引用?
情况一:需要修改原对象 需要修改原对象的情况,必须要传引用.这种情况没什么要说的. 情况二:不需要修改原对象 对于内置类型(整数.浮点数.字符类型等),传值效率更高.主要有三点原因: 内存开销更小.由 ...
- 如何基于G6进行双树流转绘制?
1. 背景 业务背景:CRM系统随着各业务条线对线索精细化分配的诉求逐渐增加,各个条线的流向规则会越来越复杂,各个条线甚至整个CRM的线索流转规则急需一种树形的可视化的图来表达. 技术背景:在开发之前 ...
- 00.XML入门
0.了解XML Extensible Markup Language 可扩展标记语言 申明信息不算元素,左图中book为根元素,根元素有且仅有一个; 1.初识XML 1.3用IDE创建xml(以ecl ...
- 【python基础】复杂数据类型-列表类型(元组)
1.初识元组 列表非常适合用于存储在程序运行期间可能变化的数据集.列表是可以修改的. 然而,有时候需要创建一系列不可修改的元素,元组可以满足这种需求 python将不能修改的值称为不可变的,而不可变的 ...
- 聊一聊 Python 安装中的 --enable-shared
由于微信不允许外部链接,你需要点击文章尾部左下角的 "阅读原文",才能访问文中链接. 今天在 CentOS 7.4 使用源码编译安装 Python-2.7.15 的时候,发现了一个 ...
- 你还在用Object.equals()方法吗?
前言 当<阿里巴巴Java开发手册>发布后,我也是仔细进行了阅读,想从中找出一些"标准",让自己的代码质量提高.手册中对 Object 的 equals 方法的使用进行 ...
- JavaWeb中Servlet、web应用和web站点的路径细节("/"究竟代表着什么)
JavaWeb中Servlet.web应用和web站点的路径细节("/"究竟代表着什么) 1 开门见山 新建一个tomcat web项目,配置tomcat的虚拟目录,取默认值(/项 ...
- 前端Vue自定义列表表格信息展示可用于商品规格参数展示
前端Vue自定义列表表格信息展示可用于商品规格参数展示 , 下载完整代码请访问uni-app插件市场地址:https://ext.dcloud.net.cn/plugin?id=13131 效果图如下 ...