2014-11-06 69 views
8
private ExecutorService exec = Executors.newSingleThreadExecutor(r -> { 
    Thread t = new Thread(r); 
    t.setDaemon(true); // allows app to exit if tasks are running 
    return t ; 
}); 

我理解执行者背后的想法,但参数r令我困惑。我用:难以理解Java 8 Lambda

final ExecutorService exec = Executors.newSingleThreadExecutor(r -> { 
     Thread t = new Thread(r); 
     System.out.println("Class of r: " + r.getClass()+ ". r to string: " + r.toString()); 
     System.out.println("Class of t: " + t.getClass() +". Name of t: "+ t.getName()); 
     t.setDaemon(true); 
     return t; 
    }); 

深入挖掘,其结果是:

Class of r: class java.util.concurrent.ThreadPoolExecutor$Worker. r to string: [email protected][State = -1, empty queue] 
Class of t: class java.lang.Thread. Name of t: Thread-3 

r被作为一个参数对Thread对象构造通过。

  1. 简单字母r如何表示传递的对象是ThreadPoolExecutor
  2. 如果ThreadPoolExecutor不按Thread's构造函数的要求执行RunnableThreadPoolExecutor如何作为参数通过?

如果有人能为我提供非lambda版本的代码,那对我的理解会有很大的好处。

回答

15

newSingleThreadExecutor将ThreadFactory作为参数。 ThreadFactory定义了一个方法newThread,它将Runnable作为参数并返回一个线程。

拉姆达可能更有意义给你,如果我们指定的r类型明确:

(Runnable r) -> { 
    Thread t = new Thread(r); 
    return t; 
} 

现在是比较明显的,这是为了newThread身体的定义。

除了由于lambda立即作为参数传递给接受ThreadFactory的方法,编译器能够推断出r的类型必须为Runnable。因此可以省略。

没有拉姆达,该代码转换为下面的匿名类的定义和实例:

private ExecutorService exec = Executors.newSingleThreadExecutor(
    new ThreadFactory() { 
     @Override 
     public Thread newThread(Runnable r) { 
      Thread t = new Thread(r); 
      t.setDaemon(true); 
      return t; 
     } 
    } 
); 

如何简单的字母r表示所传递的对象是ThreadPoolExecutor

r的类型是Runnable,因为lambda表达式的目标类型以这种方式定义了它的单个方法。

您看到的对象实际上是ThreadPoolExecutor$Worker,它是实现Runnable的ThreadPoolExecutor的私有内部类。

如何为需要ThreadPoolExecutor差强人意,如果它没有实现Runnable参数由通过Thread的构造?

参见上面(r是一个Runnable)。

+0

谢谢,Radiodef。我现在完全理解代码。我在哪里可以了解更多关于'outerclass $ innerclass'类型的记法 - Java语言规范? – user465001 2014-11-06 03:40:31

+2

我很高兴解释它。学习'$'也没有更多。当您在代码中引用嵌套类或内部类时使用'Outer.Inner',但通常将其编译为名为'Outer $ Inner'的类。 '$'是所有标识符的有效字符,但通常认为它是为内部机制保留的。 http://stackoverflow.com/q/7484210/2891664 – Radiodef 2014-11-06 03:44:38

+0

再次感谢Radiodef! – user465001 2014-11-06 03:58:28