2017-03-18 3 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(); 

このコードは機能します。しかし、これは正しい方法の1つですか?Runnable InterfaceとLambdaは正しい方法ですか?

また、なぜ次は機能しませんか?私はRunnable task3 =() -> new RunnerL().run() OR Runnable task3 = new RunnerL()に変更した場合

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

、それは動作しますが、なぜですか?

答えて

1

次のコードはRunnerLインスタンスのみを作成しますが、のrun()メソッドは実際には実行しません(実行メソッドは実行しません)。スレッドはRunnableインスタンスにrun()を呼び出し(従ってのみラムダコール):

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

は以下の通りRunnerLインスタンスを作成している間、スレッドが起動されたときに、そのインスタンスにrun()方法直接呼び出し:

Runnable task = new RunnerL(); 

実際には上記のオプションが最適です。もう1つは不要にラップしてRunnableを別のRunnableに置き換えます。スレッドを作成して開始するために、Runnableインタフェースを使用するには

0

、次の操作を実行する必要があります。

1)Runnableを実装するクラスを作成します。

class RunnerL implements Runnable {} 

2)Runnableクラスにrunメソッドを提供します。

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

     } 

3)Threadクラスのインスタンスを作成し、Runnableオブジェクトをそのコンストラクタにパラメータとして渡します。

Runnableクラスを実行できるThreadオブジェクトが作成されます。

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

4)Threadオブジェクトのstartメソッドを呼び出します。

Runnableオブジェクトのrunメソッドが呼び出され、別のスレッドで実行されます。

t.start(); 

のRunnable 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での機能のインターフェイスのポイントは次のとおりです。あなたは、ほとんどが明示的に実装する必要はありませんので、インターフェースの唯一の非デフォルトのメソッドのシグネチャと一致(メソッド参照を含む)ラムダ式インタフェースの実装として機能することができます。

0

ラムダ式は、機能インタフェース内のメソッドの実装(定義)を提供します(単一の抽象メソッドのみを含みます)。ここでは、実際にRunnableインタフェースの抽象的run()メソッドの実装を提供していることを理解する必要があります。

この概念は良くなって、以下に示すように、あなたが本当に何が起こっているのかを知ることができるように、自分のRunnerLクラスにコンストラクタを追加します。

class RunnerL implements Runnable { 

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

    //Add your run() method here 
} 

はなぜ動作しない、次のでしょうか? 実行可能タスク3 =() - >新しいRunnerL(); 新しいスレッド(task3).start();

このラムダ式(Runnableインターフェイスのrun()方法、すなわち、インプリメンテーション)は、単に(すなわち、文「と呼ばれるコンストラクタ」印刷)上記のコンストラクタを呼び出す& RunnerLのオブジェクトを作成します。

Runnable task3 =() - >新しいRunnerL().run()に変更すると、それはなぜですか?

このラムダ式は、オブジェクトを作成し&「と呼ばれるコンストラクタは」その後、同様にあなたのrun()メソッドを呼び出して印刷してコンストラクタを呼び出します。

関連する問題