Java-启动线程有不同的方法吗?

时间:2019-03-27 17:49:16

标签: java

好的,伙计们,如果某个线程尚未处于活动状态,那么我的老师将使用此代码启动一个线程。但是我被教导要运行线程,无论它是可运行线程还是扩展线程,都可以通过start方法启动它,而不运行它。但是在这种情况下,他从运行开始,为什么?

public void start2(Runnable r) {
    if (thread == null) {
        thread = new Thread(new Runnable() {
            public void run() {
                r.run();
                thread = null;
            }
        });
        thread.start();
    }
}

3 个答案:

答案 0 :(得分:0)

您的老师以 thread.start()开始线程。他只是在Thread对象初始化中实现了runnable接口,这是绝对正确的方法。

答案 1 :(得分:0)

更现代的方法是使用执行程序运行线程:

ExecutorService executor = Executors.newSingleThreadExecutor();
executor.submit(() -> {
    String threadName = Thread.currentThread().getName();
    System.out.println("Hello " + threadName);
});

您可以更好地控制线程:

  • 可以检索某些结果(带有期货)
  • 知道线程是否结束(executor.isTerminated()
  • 请求/强制关闭(executor.awaitTermination() / executor.shutdownNow())。

您的老师向您展示的thread.start()本身不支持这些功能(顺便说一句,这是启动线程的好方法)。

有关执行器的更多信息,我建议this excellent tutorial

答案 2 :(得分:0)

代码中的r.run();部分只是对Runnable r输入参数的方法调用,它将是Runnable接口的实现。

这不会启动线程

这只是一个方法调用,它执行Run方法的输入实现。
它将像其他任何方法一样执行。

然后,实际线程将从thread.start();

开始

长答案:
这里发生的是,首先检查线程变量。
 如果它为null,则使用匿名类thread = new Thread(/*here --> */new Runnable() {....初始化一个新的Thread并实现run()方法。
run()内部,使用Runnable r调用了外部方法的输入参数r.run();,然后将线程变量设置为null。
if语句之外,教师以thread.start();开始线程。