So führen Sie parallele Aufgaben in einer for-Schleife aus, um mit AutoCloseable-Dateien in Java umzugehenJava

Java-Forum
Guest
 So führen Sie parallele Aufgaben in einer for-Schleife aus, um mit AutoCloseable-Dateien in Java umzugehen

Post by Guest »

MOTIVATION
In einem YouTube-Video von Venkat Subramaniam erzählt er, wie man AutoCloseable nicht verwendet, sondern versucht, eine Funktion wie „use“ zu verwenden. Weil man möglicherweise vergisst, den Try-Block für eine Klasse zu implementieren, die AutoCloseable implementiert.
FRAGE

Ich habe diese Strategie bei vielen implementiert Es gibt jedoch einen Fall, den ich nicht bearbeiten konnte.

Ich habe viele Dateischreiber, je nach Dateityp. Alle verwenden dieselbe Schnittstelle. So kann der Hauptmakrocode analysiert und Dateiaktionen für alle Arten von Dateitypen verarbeitet werden. (Im Blog habe ich die Funktionsnamen auf nur „addText“ und die Dateitypen auf 2 reduziert: „FileWeb“ und „FileTable“.)

Und, Der Benutzer entscheidet jederzeit, welche Art von Dateien er verwenden möchte.

Die Reihenfolge der Vorgehensweise ist wie folgt. (Dort wird in der Funktion „constructFileAccordingToMacroCode“ „das zeilenweise Parsen des Makrocodes“ zweimal verarbeitet).

Code: Select all

{//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);
});
}
}
Die Art der parallelen Vorgehensweise ist wie folgt. (Dort wird die Funktion „constructFileAccordingToMacroCode“ einmal ausgeführt, daher wird „das zeilenweise Parsen des Makrocodes“ einmal verarbeitet).

Code: Select all

{//KIND OF PARALLEL
boolean produceFileTable = true;//?
boolean produceFileWeb = true;//?
FileTable.use(dir, fileLabel, fileTable -> {
FileWeb.use(dir, fileLabel, fileWeb -> {
constructFileAccordingToMacroCode(macroCode, fileTable, fileWeb);
});
});
}
Wenn ich es jedoch umsetze, verliere ich die Möglichkeit, die unerwünschten Dateitypen nicht zu erstellen.
Gibt es eine intelligentere Möglichkeit? Dinge tun?
RELEVANTE BEISPIELKLASSENDATEIEN[/b]


Haupt

Code: Select all

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[/b]

Code: Select all

public interface TGS_RunnableType1 {
public void run(A result);
}
FileInterface[/b]

Code: Select all

public interface FileInterface /*implements AutoCloseable*/{
public boolean addText(CharSequence text);
}
FileTable [/b]

Code: Select all

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
}
}
FileWeb [/b]

Code: Select all

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
}
------- ---- UPDATE -
[/b] PARALLELVERSION VON constructionFileAccordingToMacroCode

Code: Select all

    //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[i];
/*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;
}

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post