可以使用构造函数内联运行?
Posted
技术标签:
【中文标题】可以使用构造函数内联运行?【英文标题】:Inline runnable with constructor? 【发布时间】:2020-01-18 12:21:21 【问题描述】:我希望使用线程在后台处理某些内容。由于此代码未在其他任何地方使用且并不复杂,因此我想使用内联函数。但是,该函数需要一个属性的副本在创建线程时,即:如果以下示例的输出为“true”而不是“false”,我希望它
public class InlineThreadTest
boolean value;
public static void main(String[] args)
new InlineThreadTest();
InlineThreadTest()
value = true;
java.util.concurrent.Executors.newSingleThreadExecutor().execute(new Runnable()
@Override
public void run()
try
Thread.sleep(100);
catch (InterruptedException e)
System.out.println(value);
);
value = false;
...我可以通过创建一个实现 Runnable 的单独类来做我想做的事情,但是拥有这个内联似乎可能是件好事。
我查看了@https://***.com/a/362443/64696,但无法弄清楚如何将其应用于我的用例。
【问题讨论】:
在您的InlineThreadTest
方法中包含 final boolean valueRightNow = value
并在您的 run
方法中访问 valueRightNow
而不是 value
。这是链接到答案的一个非常直接的应用程序,我不明白问题是什么。
仅供参考:您所说的“内联函数”实际上是一个匿名内部类。表达式new Runnable() ...
声明了一个实现Runnable
的类,并且每次您的程序执行该表达式时,它都会创建该类的一个新实例。
谢谢 - 通过@JoachimSauer 的建议让这个工作:-)
如果你想要一个线程范围的变量,你也可以使用ThreadLocal
。
【参考方案1】:
Runnable 实现是一个线程,线程不会返回任何值。 ExecutorService.execute 方法只是运行线程,您无法获取线程的状态,无论它是否已执行。 如果你想检查 ExecutorService 执行的任务(不是线程),你应该使用 Callable 并使用 sumbit()。您修改后的示例:
public class InlineThreadTest
boolean value;
public static void main(String[] args)
new InlineThreadTest();
InlineThreadTest()
value = true;
java.util.concurrent.Future<Boolean> f =
java.util.concurrent.Executors.newSingleThreadExecutor().submit(new Callable<Boolean>()
public Boolean call()
System.out.println(value);
try
Thread.sleep(100);
catch (InterruptedException e)
value = false;
return value;
);
try
System.out.println(f.get()+" or value="+value);
catch (Exception ex)
你会得到 2 行
true
false or value=false
【讨论】:
以上是关于可以使用构造函数内联运行?的主要内容,如果未能解决你的问题,请参考以下文章