java 传递void,关于java:将参数从父级传递到public void run()-程序员宅基地

技术标签: java 传递void  

我有50%的绝望:P。我尝试(在一开始)从线程的代码更新GUI,并得到了NullException。阅读一段时间后,我了解到该线程淹没了JavaFX应用程序窗口,并且为了使我能够从线程更新GUI,我需要使用以下代码:

Platform.runLater(new Runnable() {

@Override public void run() {

//Update UI here

for (int i=0; i<2000;i++)

{

MyMainClass.leftPaneTextArea.appendText("Goodi!

");

}

}

});

因此,我确实使用了这段代码,并且确实允许我编辑主类的GUI。但是,我的问题很简单。 =>此代码,我从一个线程运行,是一个位于公共void run()(运行代码的线程的内部)中的代码。看起来像这样:

@Override

public void run() {

String tmpVar;

... (Some code)

... (Some code)

... (Some code)

Platform.runLater(new Runnable() {

@Override public void run() {

//Update UI here

for (int i=0; i<2000;i++)

{

MyMainClass.leftPaneTextArea.appendText("Goodi!

");

}

}

});

... (Some code)

... (Some code)

... (Some code)

}

如何将参数从父级的public void run()传递给此参数?

例如,字符串tmpString(我想将其传递)。

请注意,如果我在public void run()外部将其声明为静态变量(例如)=>我运行了很多线程,那么更新静态var可能并不总是准确的(因为很多线程会同时更新它)

谢谢!。

Runnables void run()不接受任何参数,也不返回任何值。 您要传递的值可以作为字段存储在父类中,然后在子类中调用父字段。

只要tmpVar是最终的(或实际上是最终的,这意味着您只需为其分配一个值),就可以使用"内部" run方法访问它。 您可以编辑问题以使您尝试的代码更加明确吗?

如果创建tmpVar final,则可以在匿名Runnable中使用它。

基本上,您需要考虑将参数传递给Runnable对象,而不是传递给run()方法。

如果将匿名类设为内部类,则很清楚:

@Override

public void run() {

String tmpVar;

// ... (Some code)

// ... (Some code)

// ... (Some code)

Platform.runLater(new Updater(tmpVar));

// ... (Some code)

// ... (Some code)

// ... (Some code)

}

// ...

public static class Updater implements Runnable {

private final String var ;

public Updater(String var) {

this.var = var ;

}

@Override

public void run() {

// Access var here

for (int i=0; i<2000;i++){

MyMainClass.leftPaneTextArea.appendText("Goodi!

");

}

}

}

现在,如果tmpVar是final或"有效地为final1",则它将与您的匿名内部类一起使用,并且基本上被转换为与上面的内部类完全相同的东西(换句话说,匿名内部类获取一个隐式字段,该字段填充有最终变量的值):

@Override

public void run() {

final String tmpVar = ...;

// ... (Some code)

// ... (Some code)

// ... (Some code)

Platform.runLater(new Runnable() {

@Override public void run() {

// access tmpVar here:

for (int i=0; i<2000;i++)

{

MyMainClass.leftPaneTextArea.appendText("Goodi!

");

}

}

});

// ... (Some code)

// ... (Some code)

// ... (Some code)

}

语言设计人员实际上可以使用非最终变量来完成这项工作,但是他们认为结果太混乱了。将会发生的事情是,该对象将被转换为与上述相同的内部类:换句话说,tmpVar的当前值将被隐式传递给匿名内部类中的字段。这将是一个全新的变量,其作用域与您正在访问的变量不同,并且其值将是创建匿名内部类时tmpVar值的"快照"。看起来实际上是一个变量,实际上是指两个具有不同值的不同变量,这被认为太容易混淆且容易出错。

但是,如果tmpVar不是最终的(或实际上不是最终的):即,您将多次为其分配值,则可以显式"快照"变量的值:

@Override

public void run() {

String tmpVar ;

// ... (Some code)

// ... (Some code)

// ... (Some code)

final String varCopy = tmpVar ;

Platform.runLater(new Runnable() {

@Override public void run() {

// access varCopy here:

for (int i=0; i<2000;i++)

{

MyMainClass.leftPaneTextArea.appendText("Goodi!

");

}

}

});

// ... (Some code)

// ... (Some code)

// ... (Some code)

}

(1)"有效最终"是指该变量仅被赋值一次。同样,这意味着您可以将其声明为final而不产生任何编译错误。

将其声明为final并将其传递给run()的解决方案就像一种魅力。 非常感谢你!

您可以随时使用吸气剂...

public class YourClass {

private String myVar;

public void do something(String aVal) {

myVar="Value you want to pass";

this.runOnUiThread(new Runnable() {

@Override

public void run() {

Log.d("TAG",getMyVar());

}

});

}

private String myVar(){

return myVar;

}

}

正如James_D发布的那样,一种选择是在内部类内部使用final var(无论是否匿名)

注释选项,例如new MyRunnable(someString)或使用Consumer< T >,您可以在此处找到

但是,您不能将Consumer< T >传递给Platform.runLater(...)。

您正在尝试做的是反对压倒一切的规则。

如果要在run()方法中传递任何参数,则实际上是在重载run()方法,并且无论如何它都不会被调用

创建新线程时,将调用no-arg run()方法。

我建议将信息存储在static上下文中的其他位置,然后在run()方法中检索它。

超载? 你确定吗?

如果您创建public void run(String ob){...},那么它是重载,对吗?

我不认为OP提议向run()方法添加参数。 出于OP本身在问题中指出的原因,创建static变量是一个糟糕的主意。

我并不是说要创建一个静态变量,而是将信息存储在一个静态的"上下文"中。

那会有什么不同呢?

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_29035405/article/details/116008787

智能推荐

Zookeeper下载与安装教程(for KOS)-程序员宅基地

文章浏览阅读1.4k次。Zookeeper是一个开源的分布式服务,是Hadoop下的一个子项目,提供了优秀的分布式一致性的解决方案。Zookeeper的主要功能包括:配置管理、名字服务、分布式锁和集群管理等功能,来统筹分布式场景下的应用服务。Zookeeper官网:https://Zookeeper.apache.org/_zookeeper下载

【愚公系列】2023年11月 Java教学课程 182-SpringCloud(微服务概念)_springboot和springcloud版本对应关系-程序员宅基地

文章浏览阅读1.4w次,点赞10次,收藏11次。Spring Cloud 是一个开源的微服务框架,它为构建分布式应用程序提供了一套丰富的工具和组件,包括服务发现、负载均衡、配置管理、消息队列、远程调用、数据监控等,使得开发人员可以更加轻松地构建、部署和管理分布式应用。Spring Cloud 基于 Spring Boot,借助 Spring Boot 的自动配置和快速开发能力,可以快速搭建一个微服务应用,并具有高可用性、可扩展性和容错性。_springboot和springcloud版本对应关系

测试客户端的使用_举例说明如何使用客户端生成工具生成出来的文件做测试-程序员宅基地

文章浏览阅读216次。插入源代码:(以下代码只是我用来测试cnblogs推荐的客户端中添加源代码的方法,效果还是比在线差了点,内容请忽略!!!!!) /** To change this license header, choose License Headers in Project Properties.* To change this template file, choose Tools | Templates_举例说明如何使用客户端生成工具生成出来的文件做测试

驱动测试签名制作_测试签名要不要cat文件-程序员宅基地

文章浏览阅读3.9k次。这里给出的是针对通过.INF文件夹第一步,要先制作测试签名在SDK 或者 DDK 环境中输入如下命令:makecert -r -pe -ss PrivateCertStore -n CN=Probe(Test) ProbeTest.cer这条命令是制作一个私有证书 ProbeTest.cer certmgr.exe /add ProbeTest.cer_测试签名要不要cat文件

ChatGPT能为前端程序员带来什么_前端 chatgpt-程序员宅基地

文章浏览阅读527次。不仅能够解答简单问题,还能够解答一些复杂的问题,节省前端程序员的时间。总之,ChatGPT可以为前端程序员提供相关技术支持和资源,帮助他们更快解决问题并提高学习效率,同时也能启发创新思路,提高工作效率和质量。3. 灵感启发:ChatGPT可以与前端程序员进行对话,有时候会激发前端程序员想到一些新的代码实现方式或解决问题的思路。有助于前端程序员学习提高。5.通过扫码小程序二维码即可使用,正版的原创的chatGPT,无需科学上网,手机+PC都可以,加速您摸鱼的神器来了。_前端 chatgpt

经典升级,长直播 | 第 19 期高级转录组分析和R数据可视化火热报名中!!!...-程序员宅基地

文章浏览阅读197次。福利公告:为了响应学员的学习需求,经过易生信培训团队的讨论筹备,现安排《高级转录组分析和R数据可视化》于2022年10月21-23 线上/线下课程 (线上课是通过腾讯会议实时直播线下课,实时互动,并录制有视频回放,无限期观看)。报名参加线上直播课的老师可在365天内选择参加同课程的一次线下课。期待和大家的线上线下相识。易生信培训改为长周期模式(具体戳链接了解)易生信培训改为长周期模式临床基因组..._直播课老师能看到线下学生吗

随便推点

java身份证号码校验工具类_java 身份证号加权因子校验-程序员宅基地

文章浏览阅读1k次。在java中如何做身份证号码校验_java 身份证号加权因子校验

蓝牙 - 小米手环3 NFC版BLE协议研究-程序员宅基地

文章浏览阅读663次。0x01 前言  最近买到了小米手环3nfc版本,基本上实现了我对手环的所有功能需求,高中的时候就缠线圈做过戒指一卡通,但是缺陷是不好看,而且只能储存一张卡,等   手环3nfc版我认为比较好的功能可以储存5张m1卡,而且可以快速切换屏幕可以显示文字在手环端操作可以设置手机静音 , 手机端操作查找手环 可以使手环震动  基于以上功能,所以想进一步的..._小米手环3 协议解析

python------给定一个句子(只包含字母和空格),将句子中的单词位置反转,单词用 空格分割, 单词之间只有一个空格,前后没有空格。_给定一个句子(只包含字母和空格), 将句子中的单词位置反转,单词用空格分割, 单词-程序员宅基地

文章浏览阅读9k次,点赞5次,收藏23次。python之字符串练习2:将句子中的单词位置反转1)题目描述> 给定一个句子(只包含字母和空格), 将句子中的单词位置反转,单词用空格分割, 单词之间只有一个空格,前后没有空格。比如: (1) “hello xiao mi”-> “mi xiao hello”输入描述:> 输入数据有多组,每组占一行,包含一个句子(句子长度小于1000个字符)输出描述:> 对于每个测试示例,要求输出句子中单词反转后形成的句子示例1:- 输入 hello xiao mi_给定一个句子(只包含字母和空格), 将句子中的单词位置反转,单词用空格分割, 单词

Dedecms错误警告:连接数据库失败,可能数据库密码不对或数据库服务器出错怎么解决?_error infos: dedecms错误警告:连接数据库失败,可能数据库密码不对或数据库服务器-程序员宅基地

文章浏览阅读1.1w次。很多站长在使用dedecms的过程中会遇到这样的错误提示“DedeCMS Error Track:DedeCMS错误警告:连接数据库失败,可能数据库密码不对或数据库服务器出错!”,那么这到底是什么原因引起的呢?一般情况下,出现这种提示问题是因为dedecms没有正确的和数据库服务器连接,主机吧分析主要原因有以下三种:一、您的数据库服务器出现了问题,如果您买的是虚拟主机或者是_error infos: dedecms错误警告:连接数据库失败,可能数据库密码不对或数据库服务器

ECT输入捕捉--T法测脉冲_ect_tc0-程序员宅基地

文章浏览阅读2.1k次。引自百度知道:速度测量是工控系统中最基本的需求之一,最常用的是用数字脉冲测量某根轴的转速,再根据机械比、直径换算成线速度。脉冲测速最典型的方法有测频率(M法)和测周期(T法)。定性分析:  M法是测量单位时间内的脉数换算成频率,因存在测量时间内首尾的半个脉冲问题,可能会有2个脉的误差。速度较低时,因测量时间内的脉冲数变少,误差所占的比例会变大,所以M法宜测量高速。如要降低测量的速度下限,可以提高编..._ect_tc0

新装ubuntu 12.04 , 使用技巧-程序员宅基地

文章浏览阅读81次。***********************************************一、让Ubuntu 12.04开机默认进入命令行模式.修改 /etc/default/grubGRUB_CMDLINE_DEFAULT_LINUX="quiet splash" 改成 GRUB_CMDLINE_DEFAULT_LINUX="text" 再sudo update-grub重启OK!..._libreoffice xlib extension