我最近在阅读implementing Runnable
或Extending thread
以及最后Implementing Callable
来创建java中的主题。 stackoverflow上的Runnable Versus Callable线程描述了引用both are designed for classes whose instances are potentially executed by another thread
的差异。这是什么意思?它会创建新线程吗?如果是,为什么我们需要将实现Runnable
的类传递给Thread
构造函数?
另外,我看到了implementing Runnable
或Extending thread
创建线程的方法。在第一种方法中,(在我找到的教程中),我们需要调用Thread
类,它需要Runnable
实例来启动线程。但是,我找不到Callable
的类似内容,因为没有接受Callable
的Thread构造函数。 Executor framework
或Future Task
用于运行这些线程。那么为什么我们说两种方式都是相同的(除了Callable重新实现某些东西并且可以抛出异常)。
最后,正在撰写
Thread t = new Thread();
Thread t1 = new Thread(new RunnableInstance());
这些是否在系统中创建了新的线程?有没有其他方法可以使用Runnable
创建新线程而不将其作为构造函数传递给Thread
类?
这不应该是一个重复的问题。
答案 0 :(得分:3)
这是什么意思?它是否会创建新的线程?
Callable和Runnable都只是接口,他们不会自己创建任何线程。相反,他们为开发人员提供API和抽象。当您想在单独的线程中执行某些代码时,通常会实现Runnable,然后您可以决定如何执行它。它还没有绑定任何线程。实际上你有很多选择:
如果是,为什么我们需要将实现Runnable的类传递给Thread构造函数?
没有。 由于Runnable不会创建线程(好吧,它只是因为它只是一个接口!),我们需要明确地执行这个Runnable。
这些是否会在系统中创建新的线程?
是
有没有其他方法可以使用Runnable创建新线程而不将其作为构造函数传递给Thread类?
答案 1 :(得分:1)
<强>可赎回强>
它将返回执行结果。
<强>可运行强>
它不会回来。但它会像callable一样单独运行。
延长线程
它也是一个可运行的。但是如果你扩展线程,你就不能扩展任何类,因为java不支持多重继承。
答案 2 :(得分:1)
Callable
和Runnable
为其他类提供了在线程中执行它们的接口。它们不包含自己的功能。最常见的方法是通过ExecutorService
。查看java.until.concurrent
中可用的课程。那里有很多选择。除非您真的打算添加新的低级线程功能,否则不会实际扩展Thread
。