好的,伙计们,如果某个线程尚未处于活动状态,那么我的老师将使用此代码启动一个线程。但是我被教导要运行线程,无论它是可运行线程还是扩展线程,都可以通过start方法启动它,而不运行它。但是在这种情况下,他从运行开始,为什么?
public void start2(Runnable r) {
if (thread == null) {
thread = new Thread(new Runnable() {
public void run() {
r.run();
thread = null;
}
});
thread.start();
}
}
答案 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();
开始线程。