当前位置: 首页 > 知识库问答 >
问题:

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

陆翰藻
2023-03-14

当一个对象被创建时(当构造函数被调用时),有没有一种替代的方法来启动一个线程。我知道你不能在构造函数中启动线程。但是如果我在类中有两个方法(类被称为任务),它们实现了Runnable: run(),连续的Recv()。run()方法调用连续的Recv()函数。连续的Recv()做一些事情。然后我在公共类中创建了一个私有类,名为start ContRecv(),在构造函数调用中启动线程,就像这样

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个答案

淳于涛
2023-03-14

在构造函数中进行大量工作是一种反模式。

特别是,它破坏了您对构造函数进行子类化的能力。

所以不要试图在构造函数中启动线程!

为什么代码是这样的

new MyThread().start();

坏?它非常易读:创建一个新线程并运行它。

如果你愿意,你仍然可以用一个方法包装这个:

public void startNewThread() {
  new MyThread().start();
}
姬正文
2023-03-14

实现你想要的最简单的方法:在创建任务时,也用它启动一个线程,就是在任务类中定义一个工厂方法,并使任务构造函数私有。见下文:

public static void createTask( ) {
    Tasks t = new tTasks();
    Thread t  = new Thread( t) ;
    t.start( );
}

并将构造函数声明为private,以确保任务实例化的唯一方式是通过这个工厂方法。否则,你将无法启动线程。此外,你应该放弃你的内部私有类,在这种情况下是没有用的。

鲁英卫
2023-03-14

您将得到一个无限循环的实例化任务对象,最终肯定会出现OutOfMemory错误。你实例化了任务的object1,然后又实例化了你的私有类,这个私有类又实例化了另一个任务的object2,这个循环就重新开始了。

 类似资料:
  • 问题内容: 我写了一个实现Runnable的类,以同时运行到另一个线程。主线程处理侦听串行端口,而第二个线程将处理向该端口发送数据。 第一个线程从第二个开始,如下所示: 这可行,但是我的编译器会标出警告语:在构造函数中启动新线程很危险。为什么是这样? 这个问题的第二部分是:如何在一个线程(串行端口侦听线程)中运行循环,并在第二个线程中键入退出命令。如何获得第一个终止的线程?谢谢。 问题答案: 你的

  • 问题内容: 我很难找到一种方法来启动,停止和重新启动Java中的线程。 具体来说,我在中有一个类Task(当前实现)。我的主应用程序需要能够在线程上启动此任务,在需要时停止(杀死)该线程,有时还可以杀死并重新启动该线程… 我的第一次尝试是与,但我似乎找不到办法重新启动任务。当我使用任何将来的呼叫失败时,因为是“关机” … 那么,我该怎么做呢? 问题答案: 一旦线程停止,你将无法重新启动它。但是,没

  • 我有这个问题,这让我发疯,我有这个课程 在我的主类中,我实例化了前一个类,并且可以毫无问题地访问属性 但是当它编译它返回给我一个错误: 线程“main”java中出现异常。lang.IllegalStateException:驱动程序可执行文件的路径必须由webdriver设置。壁虎。驱动系统属性;有关更多信息,请参阅https://github.com/mozilla/geckodriver.最

  • 问题内容: 当请求到达处理文件上传的servlet时,在该servlet中启动一个新线程是一个好主意,该线程将处理与上传的文件一起提供的另一段数据。我想以此同时处理这两项工作。 问题答案: 这不仅是一个坏主意,而且也行不通。原因如下:您的文件上传请求最终将命中方法。只要您使用此方法,容器就会保持连接打开。从该方法返回后(如果您决定在一个单独的线程中处理传入数据,则将提早完成),容器将假定您已完成请

  • 我尝试用注释,但没有没有参数的构造函数。即使我添加了一个不带参数的构造函数,也是,因此在初始化之后不能设置它。而且有一个只带参数的构造函数。 在初始化之后,我需要将其放置在内存中,并且需要能够在其他组件中自动连接它以读取/删除/添加项。我不知道怎么用Spring靴做这件事。非常感谢任何帮助。

  • 正在尝试从spring boot接收页面进行单元测试。如果与javascript一起使用,该页面可以很容易地进行反序列化,但是使用java,它会失败。已经为spring添加了一个默认构造函数(这是另一篇stackoverflow文章中接受的答案),但它在这里不起作用。 单元测试 再培训班 "' 代码在github上可用-- 反序列化引发以下错误: