2017-10-13 3 views
2

Je suis en train de tracer ce code et j'essaie de comprendre exactement ce qu'il est censé faire. Je ne peux pas le faire fonctionner sur IntelliJ. L'option d'exécution est grisée même si j'ai défini le SDK du projet. Mais je veux juste savoir ce que le code est censé faire. Je viens de lire un peu de théorie sur les threads. Est-il juste censé afficher chaque message 100 fois avec un horodatage sur différents threads? Et Runnable 4 est un exemple de la façon de le faire avec un lambda correct?Exemple d'un multithreading Java qui imprime un message 100 fois sur différents threads?

Classe principale

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); 
    } 
} 

Imprimer le message classe Runnable

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."); 
     } 
    } 
} 

Répondre

1

Dans votre exemple, vous avez 2 fils qui imprime votre message avec un horodatage. La présentation lambda de runnable est également correcte.

Mais l'utilisation de java.util.Date est dangereuse, car elle n'est pas threadsafe. Utilisez LocalDateTime dans l'application multithread pour éviter les erreurs

+0

Merci :) Je lisais juste à propos de faire des choses threadsafe en utilisant des verrous. En passant par des exemples sur ce point maintenant. – Torque

+0

Une instance 'Date' unique n'est jamais utilisée par plus d'un thread ici. Donc, ceci est parfaitement sûr. – Henry

+0

Si une instance d'objet n'est pas utilisée par plus d'un thread, inutile de penser à threadsafe en effet. – Alex