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

如何引用线程类的新实例?

危卜鹰
2023-03-14

我想首先说,如果你知道更好的方法,请告诉我。我宁愿知道一个更好的方法来做这件事,也不要做得不对。

我正在编写一个必须与多个客户端交互的服务器程序。我正在使用这个答案提出的方法。(将多个客户端编程到一台服务器的套接字)。我正在创建“EchoThread”的新实例。

我还有另一个类,它有许多变量,需要能够被服务器中的所有类/操作访问和更改。我想知道如何从创建新的“EchoThread”对象和“EchoThread”类的类中注入(我想这就是它的名称)该类的实例。

以上链接的部分答案:

 while (true) {
        try {
            socket = serverSocket.accept();
        } catch (IOException e) {
            System.out.println("I/O error: " + e);
        }
        // new threa for a client
        new EchoThread(socket).start();
    }

我有要注入的类的实例:

VarsClass vars = new VarsClass();

我通常通过做事来“链接”这些:

VarsClass vars = new VarsClass();
ExampleClass example = new ExampleClass();
example.link(vars);

下面是“ExampleClass”中的“link”方法

public void setGlobalVariables(GlobalVariables global) {

    this.globalVariables = global;

}

如何使用“ExmapleClass”和“VarsClass”引用上述示例中的“EchoThread”?我正在这样做,所以每个类都不会创建VarsClass的新实例。(避免了我在这里遇到的问题:在两个线程中使用相同的变量,但我不知道为什么它们不会在Java中更新)

提前感谢大家的耐心和帮助~拉内

共有2个答案

岳阳飙
2023-03-14

您可以使用与任何其他类的实例相同的方法来执行此操作。

EchoThread thread = new EchoThread(socket);
thread.setGlobalVariables(globalVars);
thread.start();
葛炜
2023-03-14

如何引用EchoThread。。。

简单的方法如下:

EchoThread et = new EchoThread(socket);
et.link(vars);
et.start();

或者将vars对象作为另一个参数传递给构造函数。

请注意,以下变体是错误的...除非您使EchoThread线程安全。

EchoThread et = new EchoThread(socket);
et.start();
...
et.link(vars);

(在调用start()之前传递参数是安全的,因为在调用start()之前有一个明确的“发生在…”。。。在调用start()的线程和新线程的run()方法的启动之间。)

另一个需要注意的是,编写Thread的子类通常被认为是实现多线程的糟糕方式。更好的方法是将线程的逻辑实现为Runnable;例如。

public class MyRunnable implements Runnable {
    // thread state variables here ...
    public MyRunnable(Socket sock, GlobalVariables vars) {
         ...
    }

    public void run() {
         // thread logic goes here ...
    }
}

使用方法如下:

new Thread(new MyRunnable(sock, vars)).start();

这种方法允许您轻松地将代码更改为使用线程池或执行器,而不是动态创建的线程。(动态创建线程往往成本高昂。)

 类似资料:
  • 问题内容: 我试图编写一个文件监视器,它将检查文件是否添加了新行,该监视器实际上是一个线程,它将始终由randomaccessfile读取该行。 这是监视器的核心代码: 这是一些帮助类: 这是调用监视器的示例: 现在,我的问题是,如果我仅调用以下代码,代码就可以很好地工作: 这将监视文件的行追加,并通知侦听器。 但是,当我致电: 这意味着我想监视另一个文件而不是之前。 因此,在Monitor中,我

  • 问题内容: 如果我在文件中进行设置,那么什么时候管理创建新实例以服务请求,何时在现有实例上创建新线程的规则是什么? 如果我有一个在每个请求上执行计算量大的应用程序,那么多线程能给我带来什么好处吗?换句话说,实例是多核实例还是单核? 或者,仅当现有线程正在等待IO时才启动新线程吗? 问题答案: 当前使用以下规则集确定给定实例是否可以接受新请求: 以下总的CPU /核心限制目前适用于每个实例类: 因此

  • 本文向大家介绍jvm是如何实现线程的?相关面试题,主要包含被问及jvm是如何实现线程的?时的应答技巧和注意事项,需要的朋友参考一下 考察点:JVM 线程是比进程更轻量级的调度执行单位。线程可以把一个进程的资源分配和执行调度分开。一个进程里可以启动多条线程,各个线程可共享该进程的资源(内存地址,文件IO等),又可以独立调度。线程是CPU调度的基本单位。 主流OS都提供线程实现。Java语言提供对线程

  • 我有一个活动,有一些相同类型的片段。我有一份清单。只要我点击一个列表项,我就需要调用一个activity方法,传递点击发生的片段。 我认为这是一个相当愚蠢的问题,但我搞不懂。

  • 用例 我有一个基于gRPC Guice的服务应用程序,其中对于特定的调用,代码流如下所示:

  • 问题内容: 我正在尝试的代码 我们如何根据其ID暂停/暂停线程?Thread.suspend已过时,必须有一些替代方法来实现。我有线程ID,我想挂起并杀死线程。 编辑:我用这个。 但是我无法停止该线程。 问题答案: 这些天杀死线程的正确方法就是使用它。这集真和原因,以及一些其他的方法来扔。 在线程代码内部,您应该执行类似以下的操作,检查以确保它没有被中断。 这是一个如何在线程内部处理中断异常的示例