从我在线程上花费的时间来看,我发现了以下两种编写线程的方法:Java
使用工具运行:
public class MyRunnable implements Runnable {
public void run() {
//Code
}
}
//Started with a "new Thread(new MyRunnable()).start()" call
或者,使用扩展线程
:
public class MyThread extends Thread {
public MyThread() {
super("MyThread");
}
public void run() {
//Code
}
}
//Started with a "new MyThread().start()" call
这两个代码块有什么显着区别吗?
网友回答:
dr:实现 Runnable 更好。但是,警告很重要。
一般来说,我建议使用类似的东西,而不是因为它允许你只保持你的工作与你选择的并发性松散耦合。例如,如果你使用 a 并稍后决定这实际上不需要它自己的,你可以只调用 threadA.run()。Runnable
Thread
Runnable
Thread
警告:在这里,我强烈反对使用原始线程。我更喜欢使用Callables和FutureTasks(来自javadoc:“A Cancellable Asynchronous Computing”)。对我来说,超时的集成、适当的取消和现代并发支持的线程池都比成堆的原始线程有用得多。
随访:有一个构造函数允许您使用 Runnables(如果这是您最熟悉的),并且仍然可以获得现代并发工具的好处。引用javadoc:FutureTask
如果不需要特定结果,请考虑使用以下形式的构造:
Future<?> f = new FutureTask<Object>(runnable, null)
因此,如果我们将它们替换为您的 ,我们会得到以下内容:runnable
threadA
new FutureTask<Object>(threadA, null)
另一个让你更接近Runnables的选项是ThreadPoolExecutor。您可以使用 execute 方法传入 Runnable 以执行“将来某个时间的给定任务”。
如果你想尝试使用线程池,上面的代码片段将变成如下所示(使用 Executors.newCachedThreadPool() 工厂方法):
ExecutorService es = Executors.newCachedThreadPool();
es.execute(new ThreadA());
网友回答:
是的:实施是首选的方式,IMO。你并没有真正专注于线程的行为。你只是给它一些东西来运行。这意味着作曲是哲学上“更纯粹”的方式。Runnable
实际上,这意味着您也可以从另一个类实现和扩展……你也可以通过 Java 8 的 lambda 表达式实现。Runnable
Runnable
网友回答:
故事的寓意:
仅当要覆盖某些行为时才继承。
或者更确切地说,它应该被理解为:
继承更少,接口更多。
模板简介:该模板名称为【Java中的“实现可运行”与“扩展线程” 区别对比】,大小是暂无信息,文档格式为.编程语言,推荐使用Sublime/Dreamweaver/HBuilder打开,作品中的图片,文字等数据均可修改,图片请在作品中选中图片替换即可,文字修改直接点击文字修改即可,您也可以新增或修改作品中的内容,该模板来自用户分享,如有侵权行为请联系网站客服处理。欢迎来懒人模板【Java】栏目查找您需要的精美模板。