Ana*_*and 5 java multithreading
我需要在我的java代码中实现thread.start()方法.请通过覆盖thread.start()方法以及它如何工作的示例告诉我?
Hen*_*ing 13
正如其他人所说,压倒Thread.start()不是这样做的方式.通常,我也不会覆盖Thread.run(),但使用a Runnable.
如果你必须决定在生成线程后运行哪种方法,你可以这样做:
final Runnable runnableA = ...;
final Runnable runnableB = ...;
Runnable r = new Runnable() {
@Override
public void run() {
if (...) {
runnableA.run();
} else {
runnableB.run();
}
}
}
Thread thread = new Thread(r);
thread.start();
Run Code Online (Sandbox Code Playgroud)
如果,如你所说,你有一个超类和子类,其中run()方法被覆盖,你可以只依赖后期绑定,并自动调用适当的方法:
Runnable couldBeAOrB = ...;
Thread thread = new Thread(couldBeAOrB);
thread.start();
Run Code Online (Sandbox Code Playgroud)
use*_*421 11
您可以start像任何其他方法一样覆盖
Thread myThread = new Thread() {
@Override
public void start() {
// do something in the actual (old) thread
super.start();
}
@Override
public void run() {
// do something in a new thread if 'called' by super.start()
}
};
Run Code Online (Sandbox Code Playgroud)
但你必须调用super.start()创建一个新线程并run()调用该新线程.原版start做了一些你几乎无法模仿的魔法(本机代码).
如果run()直接从您的start()(或任何其他方法)中调用,它将作为普通方法在实际线程中执行,而不是在新线程中执行.如果您不想在新线程中运行某些代码,则没有理由使用Thread.
您必须将您的决策逻辑放在run()方法中,start如果真的需要,可以在构造函数(或其他方法,最终)中使用一些变量集.我找不到任何需要这个变量的理由,它应该足以run()像其他地方已经建议的那样测试条件.
class MyThread extends Thread {
private final boolean flag;
public MyThread(boolean someCondition) {
flag = someCondition;
}
// alternative
// @Override
// public synchronized void start() {
// flag = <<someCondition>>
// super.start();
// }
@Override
public void run() {
if (flag) {
// do something like super.run()
} else {
// do something else
}
}
}
Run Code Online (Sandbox Code Playgroud)
但是如果你像@Henning建议的那样去理解和维护会更容易!
它也是一个更面向对象的解决方案......
| 归档时间: |
|
| 查看次数: |
21802 次 |
| 最近记录: |