当Java中的线程退出时,runnable类的实例是否被销毁
如果有一个类使用以下代码实现可运行类:当Java中的线程退出时,runnable类的实例是否被销毁,java,multithreading,runnable,Java,Multithreading,Runnable,如果有一个类使用以下代码实现可运行类: public class MyRunnable implements Runnable { public Thread t; // Other variables; public MyRunnable() { t = new Thread(this, "MyRunnable Thread"); // Initialise other variables. } public void
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.t.start先生()
2.MyRunnable mr=new MyRunnable();
t.start先生()
我应该举一个新的例子吗
或者我应该使用现有实例还是mr?我不喜欢这段代码 您的
Runnable
不应该有线程
成员,公共或私有。我建议把它去掉。简单想想:分离关注点。这就是您的Runnable应该是什么样子:
public class MyRunnable implements Runnable {
public void run() {
//Do something.
}
}
就这样。让其他知道如何运行的类处理该部分
您最好看看较新的并发包类,如Executor
除非你读过Brian Goetz的书并完全理解它,否则你不应该尝试做很多多线程编程。你不太可能遇到麻烦。我不喜欢这段代码 您的
Runnable
不应该有线程
成员,公共或私有。我建议把它去掉。简单想想:分离关注点。这就是您的Runnable应该是什么样子:
public class MyRunnable implements Runnable {
public void run() {
//Do something.
}
}
就这样。让其他知道如何运行的类处理该部分
您最好看看较新的并发包类,如Executor
除非你读过Brian Goetz的书并完全理解它,否则你不应该尝试做很多多线程编程。您不太可能遇到麻烦。Runnable具有run()方法,因此您不需要在该方法中使用单独的线程。并且,除非您退出变量(对象)定义的上下文并释放引用,否则不会破坏任何内容
Runnable具有run()方法,因此不需要在该方法中使用单独的线程。除非您退出变量(对象)定义的上下文并释放引用,否则不会破坏任何内容
从
MyRunnable
中删除对线程的引用
Java中的起始线程习惯用法如下所示
new Thread(new MyRunnable()).start()
垃圾收集的常规规则适用于清理可运行文件。如果没有对象引用runnable,它可能会被垃圾收集。从MyRunnable
中删除对线程的引用
Java中的起始线程习惯用法如下所示
new Thread(new MyRunnable()).start()
垃圾收集的常规规则适用于清理可运行文件。如果没有可运行的对象引用,它可能会被垃圾收集。在Java中编写多线程代码有几种习惯用法,请参阅。保持简单和独立:
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中编写多线程代码有几种习惯用法,请参阅。保持简单和独立:
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风格吗?那该怎么办呢?附言:我从这个链接得到了这种风格:你能告诉我为什么这不是Java的好风格吗?那该怎么办呢?附言:我从这个链接中得到了这种类型的样式:如果我做了如下的事情,那么它是否正确:MyRunnable mr=new MyRunnable();螺纹t=新螺纹(mr);t、 start();然后当我检查(!t.isAlive){t=new Thread(mr);t.start()}时,我基本上不想创建MyRunnable类的新实例。是否可以使用上述方法?如果您的Runnable保留任何状态,那么重用它会变得稍微复杂一些-您需要重新初始化其持久状态。因此,如果我执行以下操作,它是否正确:MyRunnable mr=new MyRunnable();螺纹t=新螺纹(mr);t、 start();然后当我检查(!t.isAlive){t=new Thread(mr);t.start()}时,我基本上不想创建MyRunnable类的新实例。是否可以使用上述方法?如果您的Runnable保留任何状态,那么重用它会变得稍微复杂一些-您需要重新初始化它的持久状态。