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

时间:2015-07-05 11:02:16

标签: java multithreading

在制作对象时(调用构造函数时)是否有另一种方法来启动线程。我知道你无法在构造函数中启动线程。但是如果我在类中有两个方法(类称为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();
        }
    }
}

3 个答案:

答案 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();
}