在制作对象时(调用构造函数时)是否有另一种方法来启动线程。我知道你无法在构造函数中启动线程。但是如果我在类中有两个方法(类称为Tasks),它实现了Runnable:run(),continuousRecv()。 run()方法调用continuousRecv()函数。 continuousRecv()做了一些事情。然后我在公共类Tasks中创建一个名为startContRecv()的私有类,并在构造函数调用中启动线程,就像这样
Thread t1 = new Thread(new Tasks());
t1.start();
我的代码:
import java.lang.Runnable;
public class Tasks implements Runnable {
public Tasks() {
startContinousReceive conRecv = new startContinousReceive();
}
public void continuiousReceive() {
while (true) {
//Code to executed
}
}
public void run() {
continuiousReceive();
}
//PRIVATE CLASS WHICH STARTS THREAD
//INSTANCE OF PRIVATE CLASS IS MADE IN CONSTRUCTOR OF TASKS CLASS
private class startContinousReceive {
public startContinousReceive() {
Thread t1 = new Thread(new Tasks());
t1.start();
}
}
}
答案 0 :(得分:1)
您将获得一个无限循环的实例化Task对象,这些对象最终将在OutOfMemoryError中结束。您实例化Task1的object1,然后再实例化您的私有类,再次实例化Task的另一个object2并重新开始循环。
答案 1 :(得分:1)
实现您想要的最简单方法:创建任务时也启动一个线程就是在Tasks类中定义一个工厂方法,并将Tasks构造函数设为私有。见下文:
public static void createTask( ) {
Tasks t = new tTasks();
Thread t = new Thread( t) ;
t.start( );
}
并声明构造函数为private,以确保实例化Task的唯一方法是通过此工厂方法。否则你也不会得到线程启动。 此外,你应该删除内部私有类,在这种情况下没用。
答案 2 :(得分:1)
在构造函数中执行大量工作是反模式。
特别是,它破坏了构造函数的子类化能力。
所以不要尝试在构造函数中启动线程!
为什么代码像
new MyThread().start();
坏?它非常易读:创建一个新线程并运行它。
如果需要,您仍然可以将其包装在一个方法中:
public void startNewThread() {
new MyThread().start();
}