我找不到与此类似的问题,但如果这是重复的话我会道歉。
//do something
//start
new Thread(r).start();
Runnable r = new Runnable() {
public void run() {
try{
Thread.sleep(5000);
//do something
}
catch(InterruptedException e){}
}
};//end new Runnable
我的问题是:我使用的是线程吗?还是只是一个可运行的对象?我不确定我是否提出了一个有意义的问题?
我是线程新手,但我对这段代码的理解是:我正在启动一个新线程,传递一个runnable对象,然后它开始重写run方法,在这种情况下线程会睡5秒然后做工作
答案 0 :(得分:2)
Runnable
接口只是声明了一个事实,即实现它的类能够在一个线程中执行,因此它提供了一个由外部线程调用和执行的接口,仅此而已。
Thread
实现Runnable
,因为它能够执行自己的run()
方法,但Runnable通常没有与线程本身相关的任何内容。 Thread的默认run()没有做任何事情,这就是你通常扩展它并定义线程的特定行为的原因。
但只是为了澄清,ThreadPoolExecutor接受Runnable
对象与Thread
完全相同。它只是声明类定义确实可以运行(或可执行)的接口。
答案 1 :(得分:2)
是的,你正在使用一个线程。 您可以通过向其构造函数传递一个Runnable对象来创建它。
“我正在启动一个新线程,传递一个可运行的对象,它开始重写的run方法,在这种情况下,线程将休眠5秒然后才能工作。”
这是正确的,但缺少关键点:此run方法将在另一个/新Thread中执行,而不是在您创建的Thread对象上调用start()的Thread中执行。
答案 2 :(得分:2)
Runnable
接口的新匿名实现。 Thread
Thread
(new Thread(r)
)并将匿名实例传递给线程实例new Thread(r).start()
)时,jvm创建了一个新线程。这个新线程又调用了匿名Runnable
实现的run()方法。 答案 3 :(得分:2)
Thread
的实例(在第一行代码中创建)表示物理线程。当您调用start()
时,JVM将生成一个新线程(使用操作系统本机方法执行此操作)并开始执行。
Runnable
只是定义run()
方法的接口(就像在第二行代码中那样)。如果将实现Runnable
的任何对象传递给Thread
构造函数,则该线程将运行run()
方法中定义的代码。
Runnable
非常轻量级,因为它们只定义了一个方法,而Thread
s具有物理线程的重量级。
不建议直接创建Thread
,因为这是一项昂贵的操作。我强烈建议您查看java Executors framework,因为它提供了一种灵活的方式来创建线程池并以Runnable
或Callable
s的形式向他们提交任务。 Executors框架为线程重用提供了宝贵的工具。