代码之家  ›  专栏  ›  技术社区  ›  Tom

如何使用lambda使用命名线程初始化threadfactory

  •  0
  • Tom  · 技术社区  · 6 年前

    使用方法引用,我可以使用以下代码创建threadfactory实例:

    ThreadFactory factory = Thread::new;
    

    从threadfactory的接口定义来看, Thread::new 将被解释为具有签名的构造函数 public Thread(Runnable target)

    线程还具有另一个重载构造函数 public Thread(Runnable target, String name) ,

    我会问如何使用这个构造函数和方法引用/lambda来构造threadfactory?

    1 回复  |  直到 6 年前
        1
  •  2
  •   chrylis -cautiouslyoptimistic-    6 年前

    ThreadFactory 只有一个抽象方法, Thread newThread(Runnable) ,所以我们需要一只 Runnable 并返回一个线程。您希望使用一个接受两个参数的方法(构造函数),并将其转换为只需要其中一个参数的方法。

    创建一个“减少”输入数量的函数 currying ,使用它是 partial application . 在这种情况下,你想 部分应用 你的线名提前了。使用lambda,您可以执行以下操作:

    String name = "thread-name";
    ThreadFactory factory = runnable -> new Thread(runnable, name);
    // -> captures the value in "name"
    

    注意这将产生 完全相同的线程名 每次调用它时,您不希望在重复使用它的情况下使用它。

    一些图书馆, such as Vavr ,具有内置的支持,可以获取具有n个参数的函数并修复一个参数,但它并没有内置到jdk中,修复非第一个参数通常需要自定义lambda。