如果有一个类使用以下代码实现runnable类:
public class MyRunnable implements Runnable {
public Thread t;
// Other variables;
public MyRunnable() {
t = new Thread(this, "MyRunnable Thread");
// Initialise other variables.
}
public void run() {
//Do something.
}
}
我正在以下列方式制作上述类的实例:
public class MyFunc () {
satic void main (String ards[]) {
MyRunnable mr = new MyRunnable();
mr.t.start();
while (true) {
Thread.sleep(10000);
if (!mr.isAlive()) {
//Execute mr again.
// How to do it ?
}
}
}
}
我该怎么做?
我有两种方法,但不确定哪一种是正确的:
1。 mr.t.start();
2. MyRunnable mr = new MyRunnable(); mr.t.start();
我应该创建一个新的mr实例吗?
或者我应该使用现有的实例还是mr?
答案 0 :(得分:3)
从Thread
删除对MyRunnable
的引用。
在Java中启动线程习惯看起来像这样
new Thread(new MyRunnable()).start()
垃圾收集的正常规则适用于清理runnables。如果没有对象引用runnable,则可能是垃圾回收。
答案 1 :(得分:1)
在Java中编写多线程代码有几个习惯用法,请参阅Java tutorials。保持简单和分离:
public class YourTask implements Runnable {
@Override
public void run() {
// do something
}
}
最小的示例应用程序:
public class YourApp {
public static void main(final String[] args) throws InterruptedException {
final YourTask yourTask = new YourTask();
final Thread thread = new Thread(yourTask);
thread.start();
thread.join();
}
}
注意并发性 - 在正确理解之前,不要在生产中使用此代码,例如阅读Java Concurrency in Practice。
答案 2 :(得分:0)
我不喜欢这段代码。
您的Runnable
不应该有Thread
成员,公共或私人。我建议删除它。想一想:关注点分离。这就是你的Runnable应该是这样的:
public class MyRunnable implements Runnable {
public void run() {
//Do something.
}
}
那就是它。让其他知道如何运行的类处理那个部分。
您最好不要查看较新的并发包类,例如Executor
。
你不应该尝试做很多多线程编程,除非你已经读过Brian Goetz' "Java Concurrency In Practice"并彻底理解。你不太可能遇到麻烦。
答案 3 :(得分:0)
Runnable有方法run(),所以你不需要在那里单独的Thread.And什么都不会被破坏,除非你从变量(对象)定义的上下文出去并且你松开了引用。
http://www.javamex.com/tutorials/threads/thread_runnable_construction.shtml