2017-10-13 1 views
2

Ich verfolge diesen Code und ich versuche herauszufinden, was genau es tun soll. Ich kann es nicht auf IntelliJ laufen lassen. Die Option run ist ausgegraut, obwohl ich das Project SDK definiert habe. Aber ich möchte nur wissen, was der Code tun soll.Java Multithreading Beispiel Nachricht 100 Mal auf verschiedenen Threads drucken?

Ich lese gerade ein bisschen Theorie über Threads. Soll es jede Nachricht 100 Mal mit einem Zeitstempel auf verschiedenen Threads anzeigen? Und Runnable 4 ist ein Beispiel, wie man es mit einem Lambda richtig macht?

Hauptklasse

import java.util.Date; 
import java.util.concurrent.*; 

public class Example02 
{ 
    public static void main(String []args) 
    { 
     // create runnables 
     PrintMessageRunnable pmRunnable1 = new PrintMessageRunnable("Runnable 1"); 
     PrintMessageRunnable pmRunnable2 = new PrintMessageRunnable("Runnable 2"); 
     PrintMessageRunnable pmRunnable3 = new PrintMessageRunnable("Runnable 3"); 

     // passing a runnable using Lambda notation 
     Runnable pmRunnable4 =() -> { 
      // this is the code inside the run method 
      String message = "Lambda Runnable"; 
      int REPETITIONS = 100; 
      int DELAY = 100; 

      try { 
       for(int i = 1; i <= REPETITIONS; i++) { 
        Date now = new Date(); 
        System.out.println(now + ": " + message + "." + i); 
        Thread.sleep(DELAY); 
       } 
      } 
      catch (InterruptedException e) { 
       System.out.println("Runnable version interrupted."); 
      } 
     }; 

     // specify how many threads the executor service should manage 
     int MAX_THREADS = 2; 
     ExecutorService pool = Executors.newFixedThreadPool(MAX_THREADS); 

     // start running 
     pool.execute(pmRunnable1); 
     pool.execute(pmRunnable2); 
     pool.execute(pmRunnable3); 
     pool.execute(pmRunnable4); 
    } 
} 

drucken Nachricht Runnable Klasse

import java.util.*; 

public class PrintMessageRunnable implements Runnable 
{ 
    private String message; 
    private int REPETITIONS = 100; 
    private int DELAY = 100; 

    public PrintMessageRunnable(String message){ 
     this.message = message; 
    } 

    public void run(){ 
     try { 
      for(int i = 1; i <= REPETITIONS; i++) { 
       Date now = new Date(); 
       System.out.println(now + ": " + message + "." + i); 
       Thread.sleep(DELAY); 
      } 
     } 
     catch (InterruptedException e) { 
      System.out.println("Runnable version interrupted."); 
     } 
    } 
} 

Antwort

1

In Ihrem Beispiel haben Sie 2 Fäden, die mit einem Zeitstempel Ihre Nachricht druckt. Die Lambda-Darstellung von Runnable ist auch korrekt. Die Verwendung von java.util.Date ist gefährlich, weil es nicht threadsicher ist. Verwenden Sie LocalDateTime in Multithread-Anwendung, um Fehler zu vermeiden

+0

Vielen Dank :) Ich habe gerade gelesen über Dinge mit Hilfe von Schlössern threadsafe. Ich gehe jetzt gleich durch Beispiele. – Torque

+0

Eine einzelne "Date" -Instanz wird hier nie von mehr als einem Thread verwendet. Das ist also absolut sicher. – Henry

+0

Wenn eine Objektinstanz NICHT von mehr als einem Thread verwendet wird, müssen Sie nicht wirklich über ThreadSafe nachdenken. – Alex

Verwandte Themen