Как запускать параллельные задачи в цикле for для работы с файлами AutoCloseable в JavaJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Как запускать параллельные задачи в цикле for для работы с файлами AutoCloseable в Java

Сообщение Anonymous »

МОТИВАЦИЯ
В видео на YouTube Венката Субраманиама он рассказывает о том, как не использовать AutoCloseable, а попробовать использовать функцию типа «использовать». Потому что можно забыть реализовать блок try в классе, который реализует AutoCloseable.
ВОПРОС

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

У меня есть много программ записи файлов в зависимости от их типов файлов. Все они используют один и тот же интерфейс. Таким образом, можно анализировать основной макрокод и обрабатывать действия с файлами для всех типов файлов. (в блоге я сократил имена функций до «addText», а типы файлов — до двух: «FileWeb» и «FileTable».)

И, пользователи каждый раз решают, какой тип файлов им нужен.

Последовательный способ действий описан ниже. (Там в функции "constructFileAccordingToMacroCode" дважды обрабатывается "построчный разбор макрокода").
{//SEQUENTIAL
boolean produceFileTable = true;
if (produceFileTable) {
FileTable.use(dir, fileLabel, fileTable -> {
constructFileAccordingToMacroCode(macroCode, fileTable);
});
}

boolean produceFileWeb = true;
if (produceFileWeb) {
FileWeb.use(dir, fileLabel, fileWeb -> {
constructFileAccordingToMacroCode(macroCode, fileWeb);
});
}
}

Параллельный способ выполнения описан ниже. (Там функция «constructFileAccordingToMacroCode» запускается один раз, следовательно, «построчный разбор макрокода» обрабатывается один раз).
{//KIND OF PARALLEL
boolean produceFileTable = true;//?
boolean produceFileWeb = true;//?
FileTable.use(dir, fileLabel, fileTable -> {
FileWeb.use(dir, fileLabel, fileWeb -> {
constructFileAccordingToMacroCode(macroCode, fileTable, fileWeb);
});
});
}
< /code>
Однако, если я собираюсь его реализовать, я потеряю возможность не создавать нежелательные типы файлов. < /p>
Есть более умный способ Делать что -то? > Main < /b>
< /p>
public class Main {
public static void main(String... s) {
var macroCode = """
LINE1: ADD_FILE_TYPE
LINE2: ADD_SYSTEM_MILLIS
""";
var dir = Path.of("c:\\fileFirectory");
var fileLabel = "fileLabel";

{//SEQUENTIAL
boolean produceFileTable = true;
if (produceFileTable) {
FileTable.use(dir, fileLabel, fileTable -> {
constructFileAccordingToMacroCode(macroCode, fileTable);
});
}

boolean produceFileWeb = true;
if (produceFileWeb) {
FileWeb.use(dir, fileLabel, fileWeb -> {
constructFileAccordingToMacroCode(macroCode, fileWeb);
});
}
}

{//KIND OF PARALLEL
boolean produceFileTable = true;//?
boolean produceFileWeb = true;//?
FileTable.use(dir, fileLabel, fileTable -> {
FileWeb.use(dir, fileLabel, fileWeb -> {
constructFileAccordingToMacroCode(macroCode, fileTable, fileWeb);
});
});
}
}

private static boolean constructFileAccordingToMacroCode(String macroCode, FileInterface... files) {
boolean result;
for (var file : files) {
//parse macroCode line by line in a for loop {
/*FOREXAMPLE LINE1: from macroCode*/
result = file.addText("I am a %s type file.".formatted(file.getClass().getSimpleName()));
if (!result) {
return false;
}
/*FOREXAMPLE LINE2: from macroCode*/
file.addText(", and time is %L".formatted(System.currentTimeMillis()));
if (!result) {
return false;
}
//}
}
return true;
}
}


TGS_RunnableType1

public interface TGS_RunnableType1 {
public void run(A result);
}
< /code>

fileInterface < /b>
< /p>
public interface FileInterface /*implements AutoCloseable*/{
public boolean addText(CharSequence text);
}


Таблица файлов

public class FileTable implements FileInterface {

private FileTable(Path dir) {
this.dir = dir;
}
final public Path dir;

@Override
public boolean addText(CharSequence text) {
//TODO add text code
return true;
}

public static void use(Path dir, String fileLabel, TGS_RunnableType1 fileTable) {
var instance = new FileTable(dir);
try {
instance.open();
fileTable.run(instance);
instance.close();
} catch (Exception e) {//SILENTLY CLOSE
try {
instance.close();
} catch (Exception e2) {
if (e2 instanceof InterruptedException) {//let InterruptedException propagate
throw e2;
}
}
if (e instanceof InterruptedException) {//let InterruptedException propagate
throw e;
}
}
}

private void open() {
//open according to dir & fileLabel & type
}

private void close() {
//close according to dir & fileLabel & type
}
}
< /code>

fileweb < /b>
< /p>
public class FileWeb implements FileInterface {

private FileWeb(Path dir) {
this.dir = dir;
}
final public Path dir;

@Override
public boolean addText(CharSequence text) {
//TODO add text code
return true;
}

public static void use(Path dir, String fileLabel, TGS_RunnableType1 fileWeb) {
var instance = new FileWeb(dir);
try {
instance.open();
fileWeb.run(instance);
instance.close();
} catch (Exception e) {//SILENTLY CLOSE
try {
instance.close();
} catch (Exception e2) {
if (e2 instanceof InterruptedException) {//let InterruptedException propagate
throw e2;
}
}
if (e instanceof InterruptedException) {//let InterruptedException propagate
throw e;
}
}
}

private void open() {
//open according to dir & fileLabel & type
}

private void close() {
//close according to dir & fileLabel & type
}


------- ------------------ ОБНОВЛЕНИЕ ----------------
ПАРАЛЛЕЛЬНАЯ ВЕРСИЯ buildFileAccordingToMacroCode
//WILL POSSIBLY CREATE OUT OF MEMORY ERROR
private static boolean constructFileAccordingToMacroCode(String macroCode, FileInterface... files) {
//parse macroCode line by line in a for loop {
var errorPresent = IntStream.range(0, files.length).parallel()
.mapToObj(i -> {
var file = files;
/*FOREXAMPLE LINE1: from macroCode*/
var result = file.addText("I am a %s type file.".formatted(file.getClass().getSimpleName()));
if (!result) {
return false;
}
/*FOREXAMPLE LINE2: from macroCode*/
file.addText(", and time is %L".formatted(System.currentTimeMillis()));
if (!result) {
return false;
}
return true;
})
.filter(result -> false)
.findAny().isPresent();
if (errorPresent) {
return false;
}
//}
return true;
}


Подробнее здесь: https://stackoverflow.com/questions/778 ... e-files-in
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»