Zunächst einmal vielen Dank, dass Sie sich die Zeit genommen haben, dies zu lesen. Der Code wird als JUnit-Test geschrieben und ausgeführt, daher weiß ich nicht, ob sich dies auf die Antwort auswirkt.

@Test
public void generate___() {
    long startTime = System.nanoTime();
    for (File file : getResultsFromFolder("C:\\temp\\....")) {
        class runnableClass implements Runnable{
            public void run() {
                // do something with file

            }
        }
        new runnableClass().run();
    }

    long endTime = System.nanoTime();
    System.out.println("total took: " + (endTime - startTime) / 1000000); //divide by 1000000 to get milliseconds.
}
0
Allen H. 19 Apr. 2018 im 17:09

4 Antworten

Beste Antwort

Diese Methode ist aufgrund der Erstellung einer ausführbaren Instanz in Ihrer Methode kein Multithreading.

Beispiel für die Präsentation der Antwort:

 public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
            Runnable myRunnable = new Runnable() {
                @Override
                public void run() {
                    System.out.println(Thread.currentThread().getName());
                }
            };
            myRunnable.run();
        }
    }

Ausgabe

main
main
main
main
main
main
main
main
main
main

Um diese Methode multithreaded zu machen, können Sie einen ExecutorService verwenden.

 public static void main(String[] args) {

    ExecutorService executorService = Executors.newFixedThreadPool(2);

    for (int i = 0; i < 10; i++) {
        Runnable myRunnable = new Runnable() {
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName());
            }
        };

        executorService.execute(myRunnable);
    }

    executorService.shutdown();
}

Ausgabe

pool-1-thread-1
pool-1-thread-2
pool-1-thread-1
pool-1-thread-2
pool-1-thread-1
pool-1-thread-2
pool-1-thread-1
pool-1-thread-2
pool-1-thread-1
pool-1-thread-2
2
Garreth Golding 19 Apr. 2018 im 14:32

Nein ist es nicht.

new runnableClass().run();

Dies ruft die run -Methode direkt wie oben definiert auf.

Wenn Sie möchten, dass dieser Code Multithreading-fähig ist, müssen Sie Folgendes verwenden:

new Thread(new runnableClass()).start();
2
OldCurmudgeon 19 Apr. 2018 im 14:25

Nein, die ausführbare Datei wird vom Hauptaufrufer-Thread wie folgt ausgeführt:

for (File file : getResultsFromFolder("C:\\temp\\....")) {
     // do something with file
}

Um es multithreaded zu machen, können Sie neue Threads erstellen und start() aufrufen:

for (final File file : getResultsFromFolder("C:\\temp\\....")) {
    class runnableClass implements Runnable{
        public void run() {
            // do something with file
        }
    }
    new Thread(new runnableClass()).start();
}
2
xingbin 19 Apr. 2018 im 14:32

Als Ergänzung zu diesem Tutorial wird gut erklärt, was Sie wissen möchten. Und es hat Beispiel

https://www.tutorialspoint.com/java/java_multithreading.htm

0
Arnauld Alex 19 Apr. 2018 im 14:16