【问题标题】:Static method,new thread performance question静态方法,新线程性能问题
【发布时间】:2010-06-14 18:22:20
【问题描述】:

关于我的应用程序中许多控制器/servlet 中使用的两种方法,我只有两个问题:

1-在 util 类中调用静态方法或非静态方法(如处理日期的方法,即获取当前时间,在时区之间转换)有什么区别,哪个更好? 2-直接在控制器中调用方法(包含太多逻辑,例如发送电子邮件)或在不同线程中运行此方法有什么区别?

【问题讨论】:

    标签: java multithreading static-methods


    【解决方案1】:

    1)

    • Utils 类通常没有任何与之关联的状态。他们只是有行为。因此,创建它们的“实例”确实没有多大意义。
    • 即使编译器永远不会抱怨,但实例化 Util 类将是一种误导性编码。
    • 作为无状态的 Utils 类是完全线程安全的。类方法,无论是否静态,都被复制到每个线程堆栈帧中,并且不会相互干扰。 Java Utils 类就是很好的例子。

    2)

    • 如果您的方法很耗时,那么将其设置为异步调用是有意义的。

    【讨论】:

      【解决方案2】:

      使用静态方法有利有弊:

      优点:

      1. 您无需实例化对象即可使用它们。
      2. 类中定义的静态变量在调用之间保持不变。

      缺点:

      1. 您只能访问静态变量和静态方法,而无需创建对象实例来调用它们。
      2. 本质上不是线程安全的...如果您不希望其他线程更改您的变量,您必须同步方法或代码段。

      根据我的个人经验,静态方法非常适合不需要您在调用之间保持状态的事情。比如格式化日期。

      话虽如此,时间操作还是很简单的。 获取当前时间很简单:

      Date currentDate = new Date();
      

      Calendar currentCal = Calendar.getInstance();
      

      如果您知道时区之间的差异,日历也可以用于roll Calendar.HOUR_OF_DAY(和Calendar.MINUTE)。

      【讨论】:

      【解决方案3】:

      1:所以static关键字只告诉你方法的可访问性。如果方法是static,则无需实例化对象即可访问它。所以问哪个更好:静态还是非静态是没有意义的。

      2:在单独的线程上调用具有一些耗时逻辑的方法可以让您的主线程继续处理其他一些重要的事情。因此,如果您需要为客户端执行两个耗时的任务,那么在单独的线程上运行这两个任务可以更快地完成工作。

      请注意,所有这一切都是假设程序员知道如何进行正确的线程处理...如果线程处理不正确,那么可能会出现一系列问题:死锁、无效的对象状态、性能下降等。

      【讨论】:

      • 2:问题提到了 Servlets,所以这是一个 Web 应用程序......即没有 UI 线程。
      • @R。 Bemrose 谢谢,我更新了问题......虽然概念是相同的:在单独的线程中运行该方法允许您的其他线程也可以做一些工作,无论是更新 UI 还是执行其他任务。
      【解决方案4】:

      #1 似乎在其他回复中得到了很好的回答。

      #2 视情况而定。如果控制器必须等待其他线程完成发送电子邮件任务之前,它可以继续,那么根本没有速度提升——事实上会有速度损失 由于上下文切换和同步。如果控制器可以为另一个请求提供服务,或者如果它可以与电子邮件发送线程并行执行其他操作,那么就会有收获。

      通常,如果控制器需要发送电子邮件,它会将工作交给工作线程,然后继续并行处理并处理下一个请求。这更快,但这意味着如果电子邮件发送失败,则无法向呼叫者报告问题。

      【讨论】:

        猜你喜欢
        • 2012-03-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-23
        • 2011-01-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多