2016-11-25 2 views
2

私はこのコードを持っていますが、incrementOnlyへのメソッド呼び出しがある部分では37行目から43行目までは分かりません。ラムダ式はどのようにJavaで動作するのですか?

相続人は、私の理解では、(これは正しいですか?) t2はちょうどそれはメソッドincrementOnlyを呼び出します、ライン36で新しいスレッドを作成しますラインで35

T3を新しいスレッドを作成します。

次に、行41では、t2に対して実行メソッドが実行されます。 42行目でt3のrunメソッドが実行されます。

package aa.race; 

import java.util.concurrent.ForkJoinPool; 
import java.util.concurrent.locks.Lock; 
import java.util.concurrent.locks.ReentrantLock; 

public class ThreadDemoCounter implements Runnable 
{ 
    int counter; 
    int alternate; 
    String name; 


    public static int numLoops = 4; 
    public static int numPrints = 1500; 

    public ThreadDemoCounter(String n) 

    { 
     name = n; 
     counter = 0; 
    } 


    // For bonus -- delete method go. Change main to below code: 
    public static void main(String[] args) throws Exception 
    { 
     ThreadDemoCounter c1 = new ThreadDemoCounter("c1"); 
     //Run the multithreaded demo a few times 
     for (int foo = 0; foo < numLoops; foo++) 
     { 
      c1.counter = 0; 

      Thread t1 = new Thread(c1); 
      Thread t2 = new Thread(c1); 

      Thread t3 = new Thread(c1::incrementOnly); 
      Thread t4 = new Thread(c1::incrementOnly); 

      t1.start(); 
      t2.start(); 
      t3.start(); 
      t4.start(); 


      t1.join(); 
      t2.join(); //wait for both 
      t3.join(); 
      t4.join(); //wait for both 

      System.out.println("c1 = " + c1.counter); 
      System.out.println("===== end loop ====="); 
     } 

    } 


    public void incrementOnly() 
    { 
     for (int i =0 ; i < numPrints; i++) 
     { 
      incrementCounter(); 
     } 
    } 

    public void run() 
    { 

     for (int j = 0; j < numPrints; j++) 
     { 


      LockFactory.getLock(name).lock(); 
      System.out.println("counter " + name + " = " + getCounter() + " retrieved by thread: " + Thread.currentThread().getName()); 

      incrementCounter(); 
      LockFactory.getLock(name).unlock(); 

     } 
     System.out.println(); 
    } 

    public int getCounter() 
    { 
     return counter; 
    } //start at 0 

    public void incrementCounter() 
    { 
     LockFactory.getLock(name).lock(); 

     counter++; 
     LockFactory.getLock(name).unlock(); 
    } 
} 

答えて

4

全4コンストラクタ呼び出しはRunnableメソッドvoid run()@FunctionalInterfaceあるThread(Runnable target)を呼んでいます。スレッドが開始されると、Runnablerun()メソッドが呼び出されます。

最初の二つのコンストラクタはnew Thread(c1)ThreadDemoCounterのインスタンスを通過しているので、これらの2つのスレッドがc1例えばThreadDemoCounter.run()メソッドを呼び出す呼び出します。

他の2つのコンストラクタコールは、メソッドc1method referenceを渡しています。これは、引数なしのvoidメソッドでもあるため、有効なメソッドです。これら2つのスレッドはc1インスタンスのThreadDemoCounter.incrementOnly()メソッドを呼び出します。全てにおいて

、あなたは4つのスレッドを実行している必要があります、c1すなわち、すべてのThreadDemoCounterの同じインスタンス上で、それらの二人はrun()メソッドを実行し、そのうちの二人はincrementOnly()メソッドを実行します。

FYI:このコードにはlambda expressionsはありません。 method reference expressionはラムダ式ではありません。

+0

優れた説明です。ありがとう! – NoMoreErrors

関連する問題