2017-03-18 77 views
2
class RunnerL implements Runnable { 

    @Override 
    public void run() { 
     // TODO Auto-generated method stub 
     for (int i = 0; i < 10; i++) { 
      System.out.println("demo3-Hello: " + i); 
      try { 
       Thread.sleep(100); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
    } 
} 

Then, in main function: 

     Thread t1 = new Thread (() -> new RunnerL().run()); 
     Thread t2 = new Thread (() -> new RunnerL().run()); 

     t1.start(); 
     t2.start(); 

此代碼有效。但這是否是正確的做法之一?Runnable接口和Lambda,這是正確的方法之一?

此外,爲什麼以下不起作用?

Runnable task3 =() -> new RunnerL(); 
new Thread (task3).start(); 

如果我將其更改爲Runnable task3 =() -> new RunnerL().run() OR Runnable task3 = new RunnerL(),它的工作原理,爲什麼呢?

回答

1

由於以下代碼僅創建RunnerL實例,但方法Runnable並未真正運行它(不執行run方法)。該線程上Runnable實例調用run()(因此只調用拉姆達):

Runnable task3 =() -> new RunnerL(); 

而下面創建RunnerL實例,當線程啓動時,它在該實例上直接調用run()方法:

Runnable task = new RunnerL(); 

以上實際上是最好的選擇,另一個不必要的工作將Runnable換成另一個Runnable

0

要使用Runnable接口來創建和啓動一個線程,你必須做到以下幾點:

1)創建一個實現Runnable的類。

class RunnerL implements Runnable {} 

2)在Runnable類中提供run方法。

public void run() { 
     // TODO Auto-generated method stub 

     } 

3)創建一個Thread類的實例,並將Runnable對象作爲參數傳遞給它的構造函數。

創建一個可以運行Runnable類的線程對象。

RunnableClass rc = new RunnableClass(); 
Thread t = new Thread(rc); 

4)調用Thread對象的start方法。

Runnable對象的run方法被調用並在一個單獨的線程中執行。

t.start(); 

可運行TASK3 =() - >新RunnerL();

**This is not running your runnable class.Just creating an instance.** 
0

在Java8中,您實際上並不需要在您的班級中實施Runnable。如果它具有正確的簽名,Java將接受該方法爲Runnable。因此,舉例來說:

class CountToTen { 
    public void count() { 
     IntStream.rangeClosed(1, 10).forEach(System.out::println); 
    } 
} 

CountToTen counter = new CountToTen(); 
Thread thread1 = new Thread (counter::count); 
thread1.start(); 

這是功能界面中的Java 8點:你大多不需要明確地執行它們,因爲lambda表達式(包括方法的引用)匹配接口的唯一非默認方法的簽名可以充當接口的實現。

0

Lambda表達式提供了函數接口內部方法的實現(定義)(僅包含單個抽象方法)。所以在這裏,你需要明白你實際上提供了接口方法的實現。

爲了得到這個概念比較好,只是構造添加到您的RunnerL類,如下圖所示,這樣就可以看到什麼是真正發生的事情:

class RunnerL implements Runnable { 

    public RunnerL() { 
     System.out.println(" constructor called "); 
    } 

    //Add your run() method here 
} 

爲什麼下面不工作? Runnable task3 =() - > new RunnerL(); new Thread(task3).start();

這Lambda表達式(即,執行用於Runnable接口的run()方法)簡單地創建用於RunnerL &對象調用上面的構造(即,打印語句的構造函數稱爲')。

如果我將它更改爲Runnable task3 =() - > new RunnerL().run(),它的工作原理是什麼?

這Lambda表達式創建對象,通過打印&然後調用你的run()方法以及「調用的構造函數」調用構造函數。

相關問題