【问题标题】:Java - Is this method multithreaded?Java - 这种方法是多线程的吗?
【发布时间】:2018-04-19 14:09:36
【问题描述】:

首先,感谢您花时间阅读本文。该代码是作为 JUnit 测试编写和执行的,所以我不知道这是否会影响答案。

@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.
}

【问题讨论】:

  • 取决于getResultsFromFolder 是否是多线程的。否则,我看不到任何线程的创建。
  • 我不同意雅各布的观点;由于您正在为从getResultsFromFolder("C:\\temp\\....") 获得的每个文件创建并运行一个新线程(Runnable),因此它是多线程的
  • @ArnauldAlex A Runnable 不是 Thread
  • javarevisited.blogspot.fr/2012/01/… 好的,很难看出区别,但是好的。
  • @ArnauldAlex,您链接的文章标题具有误导性。它没有解释 Thread Runnable 是什么之间的区别。 Thread 是一个具有魔术方法 start() 的对象,它创建一个新线程。 Runnable 只是一个接口:它根本不任何事情。如果您创建了一个实现可运行的类,那么您将被允许将其存储在Runnable 变量中,并将其传递给接受Runnable 参数的函数。但是编译器会要求你的类有一个run() 方法。

标签: java multithreading junit parallel-processing


【解决方案1】:

由于在您的方法中创建了 Runnable 实例,因此该方法不是多线程的。

展示答案的示例:

代码

 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();
        }
    }

输出

main
main
main
main
main
main
main
main
main
main

要使这个方法多线程,您可以使用 ExecutorService。

代码

 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();
}

输出

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

【讨论】:

  • 感谢您展示这一点。是否有快速调整以将其更改为多线程?
  • 我已经更新了我的答案以展示如何使用 ExecutorService 来实现这个多线程。如果有帮助,请采纳答案。
  • 谢谢!这与一些同事的实现完全吻合。 ExecutorService.execute 是诀窍!
  • 我能够将其用于多线程,但 run() 方法中的代码块的行为与预期不符。关于我可以从哪里开始寻找的任何线索?
  • 你能用run方法中的代码更新你的问题吗?我可以试试帮助。
【解决方案2】:

不,不是。

new runnableClass().run();

这会直接调用上面定义的run 方法。

如果你希望这段代码是多线程的,你需要使用:

new Thread(new runnableClass()).start();

【讨论】:

  • @AKSW - 已编辑。
【解决方案3】:

不,runnable 将由主调用者线程执行,就像这样:

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

要使其成为多线程,您可以创建新线程并调用start()

for (final File file : getResultsFromFolder("C:\\temp\\....")) {
    class runnableClass implements Runnable{
        public void run() {
            // do something with file
        }
    }
    new Thread(new runnableClass()).start();
}

【讨论】:

  • 非常感谢您的回答!
  • @AllenH。没问题:)
  • 我能够将其用于多线程,但 run() 方法中的代码块的行为与预期不符。关于我可以从哪里开始寻找的任何线索?
  • @AllenH。最好创建一个新问题并发布更多详细信息。
【解决方案4】:

作为补充,请参阅本教程,它很好地解释了您想知道的内容。 它有例子

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-29
    • 1970-01-01
    相关资源
    最近更新 更多