可以使用构造函数内联运行?

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

【讨论】:

以上是关于可以使用构造函数内联运行?的主要内容,如果未能解决你的问题,请参考以下文章

Java hashset构造函数内联[重复]

内联函数和宏定义

Part4 类与对象 4.3构造函数

具有约束的内联记录构造函数的存在类型

2017.2.20

C++笔记--构造函数(2-1)