2017-01-04 6 views
0

Я написал программу для реализации для выполнения двух разных задач с помощью Executor Framework в качестве части для изучения многопоточности. Раньше я использовал синхронизированный метод для полного заполнения этого требования, но он дал неправильные результаты. Затем я узнал, что использование Executor Framework - лучший подход для управления потоками.несколько задач с картой исполнителя

Ниже Progam с использованием синхронизации методов

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

     } 
    } 

Проблема здесь я не знаю, чтобы написать код для Исполнителя, которые выполняют две задачи. Я реализовал код с ExecutorService для выполнения одной задачи, т.е.

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


     es.submit(new MyRunnable()); 


    } 

Наконец, кто-то может предложить мне реализовать две различные задачи с палачом Framework?

PS: Позвольте мне знать, для какой-либо путаницы по проблеме понимания заявления

ответ

1

Вы очень близки:

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

Или же:

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

Каждая задача может синхронизировать друг с другом, как в норме, так же, как если бы вы были запущены задачи сырьевыми потоками самостоятельно.

+0

Спасибо, Трэвис, теперь он работает правильно. – Ankit

0

Я не знаю, ваше намерение упражнений. в вашей версии синхронизации. вы ничего не синхронизировали. два потока обращаются к TestNotes.txt последовательно, потому что только один файл может открыть файл для записи в данный момент. Это ваше намерение?

+0

мой вариант использования - два потока, которые хотят писать разные тексты в одном текстовом файле. Следовательно, необходимо использовать структуру исполнителей. – Ankit