Java:启动线程(替代在构造函数中启动)
创建对象时(调用构造函数时)是否有其他方法启动线程。我知道你不能在构造函数中启动线程。但是,如果我在实现Runnable的类(类称为Tasks)中有两个方法:run(),continuousRecv()。run()方法调用continuousRecv()函数。continuousRecv()执行一些操作。然后,我在公共类任务中创建一个名为startContRecv()的私有类,并在构造函数中调用start thread,如下所示Java:启动线程(替代在构造函数中启动),java,multithreading,Java,Multithreading,创建对象时(调用构造函数时)是否有其他方法启动线程。我知道你不能在构造函数中启动线程。但是,如果我在实现Runnable的类(类称为Tasks)中有两个方法:run(),continuousRecv()。run()方法调用continuousRecv()函数。continuousRecv()执行一些操作。然后,我在公共类任务中创建一个名为startContRecv()的私有类,并在构造函数中调用start thread,如下所示 Thread t1 = new Thread(new Tasks(
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();
}
}
}
您将得到一个实例化Tasks对象的无限循环,最终肯定会出现OutOfMemoryError。您实例化任务的object1,然后实例化您的私有类,私有类再次实例化另一个任务的object2,然后循环重新开始。实现所需的最简单的方法是:创建任务时也启动线程,它是在Tasks类中定义工厂方法,并使Tasks构造函数私有。见下文:
public static void createTask( ) {
Tasks t = new tTasks();
Thread t = new Thread( t) ;
t.start( );
}
并将构造函数声明为private,以确保实例化任务的唯一方法是通过此工厂方法。否则,您将无法启动线程。
另外,您应该删除您的内部私有类,在这种情况下它是无用的。为什么?
在构造函数中执行大量工作是一种反模式
特别是,它破坏了您对构造函数进行子类化的能力
所以不要试图在构造函数中启动线程
为什么代码是这样的
new MyThread().start();
糟糕?它非常可读:创建一个新线程并运行它
如果需要,您仍然可以将其包装在方法中:
public void startNewThread() {
new MyThread().start();
}
你知道在类中成功启动线程的方法吗?顺便说一句,无限循环不做任何消耗内存的任务,例如.gpublic void continiousRecieve(){while(true){String recv=sock.receivePacket();if(recv!=null){internalRoomID=Integer.parseInt(recv.split(“%”[3]);}}}}如果你错过了我的要点,你就进入了创建任务对象的无限循环。当然,这会在某一点上影响内存:)。通过从私有类构造函数调用任务构造函数,它将再次调用私有类构造函数,而私有类构造函数将再次调用任务构造函数。如果我认为这更好,它永远不会结束对象构造,我想你会更快地得到堆栈溢出:)我不明白,你能给我演示代码吗