2017-01-04 2 views
0

je rédigeais un programme à mettre en œuvre pour l'exécution de deux tâches différentes avec le cadre Exécuteur dans le cadre d'apprendre le multi-threading. Auparavant, j'utilisais la méthode synchronisée pour répondre à cette exigence, mais il donnait de mauvais résultats. Ensuite, j'ai appris que l'utilisation de Executor Framework est une meilleure approche pour la gestion des threads.tâches multiples avec cadre exécuteur

Ci-dessous à l'aide Progamme synchroniser des méthodes

import java.io.*; 
import java.util.Scanner; 
import java.nio.*; 
class FileWriteThreadExample implements Runnable{ 
    /*This class needs to write some content into text file*/ 

    public synchronized void run() { 
      StringBuilder thisProgamMessage = new StringBuilder(); 

      try(FileWriter fw = new FileWriter("C:\\TestNotes.txt", true); 
       BufferedWriter bw = new BufferedWriter(fw); 
       PrintWriter out = new PrintWriter(bw)) 
      { 
       for(int i=1; i<=50;i++){ 
        //Thread.sleep(500); 
        //System.out.println(i); 

        thisProgamMessage.append(i+":"+Math.random()+"\n"); 

       } 
       out.println(thisProgamMessage.toString()); 
      } catch (IOException e) { 
       //exception handling left as an exercise for the reader 
      } 

    } 
} 

class FileWriteThreadExample2 implements Runnable{ 
    /*This class needs to write some content into text file*/ 

    public synchronized void run() { 
      StringBuilder thisProgamMessage = new StringBuilder(); 
      try(FileWriter fw = new FileWriter("C:\\TestNotes.txt", true); 
       BufferedWriter bw = new BufferedWriter(fw); 
       PrintWriter out = new PrintWriter(bw)) 
      { 


       System.out.println("Starting Second Write Thread Task"); 
       for(int i=50; i>=1;i--){ 
        //Thread.sleep(500); 
        //System.out.println(i); 
        thisProgamMessage.append(i+"====>"+Math.random()+"\n"); 
       } 
       out.println(thisProgamMessage.toString()); 
       System.out.println("Completing Second Write Thread Task"); 
      } 
      catch (FileNotFoundException fnfe){ 
       fnfe.printStackTrace(); 
      } 
      catch(IOException ioex) { 
       ioex.printStackTrace(); 
      } 
      /*catch(InterruptedException ie){ 
       ie.printStackTrace(); 
      }*/  
    } 
} 
class SynchronizeTest { 
     public static void main (String[] args) { 
      FileWriteThreadExample t1 = new FileWriteThreadExample(); 
      FileWriteThreadExample2 t2 = new FileWriteThreadExample2(); 

      t1.start(); 

      t2.start(); 

     } 
    } 

problème est que je ne sais pas ici d'écrire du code pour Exécuteur qui exécutent deux tâches. Je l'avais mis en œuvre avec le code ExecutorService pour l'exécution de tâche unique à savoir

ExecutorService es = Executors.newFixedThreadPool(5); 
    public void doStuff() { 


     es.submit(new MyRunnable()); 


    } 

Enfin, quelqu'un peut-il me suggérer de mettre en œuvre deux tâches différentes avec cadre Exécuteur?

PS: Permettez-moi de toute confusion sur le compte de problèmes de compréhension

Répondre

1

Vous êtes très proche:

ExecutorService es = Executors.newFixedThreadPool(5); 
public void doStuff() { 
    es.submit(new FirstTask()); // FirstTask implements Runnable 
    es.submit(new SecondTask()); // SecondTask implements Runnable 
} 

Ou bien:

ExecutorService es = Executors.newFixedThreadPool(5); 
public void doStuff() { 
    Collection<Runnable> tasks = Arrays.asList(new Runnable[] 
      { new FirstTask(), new SecondTask() }); 
    es.invokeAll(tasks); 
} 

Chaque tâche peut se synchroniser comme normale, comme si vous étiez en cours d'exécution des tâches dans les threads premières vous.

+0

Merci Travis, Son fonctionne maintenant correctement. – Ankit

0

Je ne sais pas votre intention d'exercice. dans votre version de synchronisation. vous n'avez rien synchronisé. les deux fils l'accès TestNotes.txt séquentielle, car un seul fichier peut ouvrir un fichier pour écrire à un moment.is ce votre intention?

+0

mon cas d'utilisation est deux fils veut écrire un texte différent sur fichier texte. Par conséquent, besoin d'utiliser le cadre de l'exécuteur. – Ankit