Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:启动线程(替代在构造函数中启动)_Java_Multithreading - Fatal编程技术网

Java:启动线程(替代在构造函数中启动)

Java:启动线程(替代在构造函数中启动),java,multithreading,Java,Multithreading,创建对象时(调用构造函数时)是否有其他方法启动线程。我知道你不能在构造函数中启动线程。但是,如果我在实现Runnable的类(类称为Tasks)中有两个方法:run(),continuousRecv()。run()方法调用continuousRecv()函数。continuousRecv()执行一些操作。然后,我在公共类任务中创建一个名为startContRecv()的私有类,并在构造函数中调用start thread,如下所示 Thread t1 = new Thread(new Tasks(

创建对象时(调用构造函数时)是否有其他方法启动线程。我知道你不能在构造函数中启动线程。但是,如果我在实现Runnable的类(类称为Tasks)中有两个方法:run(),continuousRecv()。run()方法调用continuousRecv()函数。continuousRecv()执行一些操作。然后,我在公共类任务中创建一个名为startContRecv()的私有类,并在构造函数中调用start thread,如下所示

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]);}}}}如果你错过了我的要点,你就进入了创建任务对象的无限循环。当然,这会在某一点上影响内存:)。通过从私有类构造函数调用任务构造函数,它将再次调用私有类构造函数,而私有类构造函数将再次调用任务构造函数。如果我认为这更好,它永远不会结束对象构造,我想你会更快地得到堆栈溢出:)我不明白,你能给我演示代码吗