Как использовать несколько вызовов? - PullRequest
0 голосов
/ 03 декабря 2018

У меня есть текстовый файл со списком из 5000 имен и с именем, отформатированным следующим образом: «Мужское» («МО») или «Только женское» («ФО») или «Мужское и женское» («МФ»).

FO ABBY

MO ABDUL

MO ABE

MO ABEL

FO ABIGAIL

Я хочу использовать функцию вызова, а затем вернутьсколько "FO", "MO" и "MF" есть в файле и сохраните возвращаемые значения в будущем списке, а затем выведите их на экран.

Я ожидаю следующий вывод:

MF - 331

MO - 0

FO - 3944

Как мне вызвать нескольковызываемые, которые вычисляются одновременно.Я не получаю ничего за «ФО», и большинство имен - «ФО».

Ожидаемые результаты должны распространяться примерно так:

MF - 500

MO - 1500

FO - 3000

Яновичок в многопоточности, поэтому я не уверен, что я делаю неправильно.Я был бы признателен, если бы вы указали мне правильное направление

  public class ParsingTextFile {
  /**Main method
 * @throws InterruptedException 
 * @throws ExecutionException */
  public static void main(String[] args) throws InterruptedException, ExecutionException {
    // Declare file reader and writer streams

      String code = null ;


      List<Callable<Integer>> callables = Arrays.asList(
                callable("MF",ThreadLocalRandom.current().nextInt(1, 5 + 1)),
                callable("MO",ThreadLocalRandom.current().nextInt(1, 5 + 1)),
                callable("FO",ThreadLocalRandom.current().nextInt(1, 5 + 1))
                );
      // Process a record

      ExecutorService exe = Executors.newCachedThreadPool();
      List<Future<Integer>> arr = exe.invokeAll(callables);


      for (Future<Integer> s : arr) { 
            System.out.println(s.get());
        }


      exe.shutdownNow();

    }




  static Callable<Integer> callable(String result, long sleepSeconds) {
        return () -> {

            int count = 0;

            FileReader frs = null;
            FileWriter fws = null;

            // Declare streamTokenizer
            StreamTokenizer in = null;

            // Declare a print stream
            PrintWriter out = null;

            try     {
                  // Create file input and output streams
                  frs = new FileReader("census.txt");


                  // Create a stream tokenizer wrapping file input stream
                  in = new StreamTokenizer(frs);



                  // Read first token
                  in.nextToken();



            while (in.ttype != StreamTokenizer.TT_EOF)     {
                // Get student name

                if (in.ttype == StreamTokenizer.TT_WORD)
                {
                  String val = in.sval;

                    if (val.equals("MF") && result == "MF")
                    {
                        count++;
                    }
                    else if(val.equals("MO") && result == "M0")
                    {
                        count++;
                    }
                    else if(val.equals("FO") && result == "FO")
                    {
                        count++;
                    }

                }

                else
                  System.out.println("Bad file format");



                in.nextToken();
              }
            }
            catch (FileNotFoundException ex)   {
              System.out.println("File not found: census.text");
            }
            catch (IOException ex)   {
              System.out.println(ex.getMessage());
            }
            finally   {
              try     {

                if (frs != null) frs.close();
                if (fws != null) fws.close();
              }
              catch (IOException ex)  {
                System.out.println(ex);
              }
            }

        return count;

        };

  }
...