У меня есть текстовый файл со списком из 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;
};
}