静态方法,新线程性能问题

时间:2010-06-14 18:22:20

标签: java multithreading static-methods

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

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

4 个答案:

答案 0 :(得分:3)

1)

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

2)

  • 如果你的方法很耗时,那么让它的调用异步是有意义的。

答案 1 :(得分:0)

1:因此static关键字只会告诉您该方法的可访问性。如果方法是static,则可以在不实例化对象的情况下访问它。因此,问哪个更好是没有意义的:静态或非静态。

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

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

答案 2 :(得分:0)

使用静态方法有优点和缺点:

优点:

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

    1. 您只能访问静态变量和静态方法,而无需创建对象实例来调用它们。
    2. 本质上不是线程安全的......如果您不希望其他线程更改变量,必须同步方法或代码段。
    3. 根据我的个人经验,静态方法非常适合不要求您在调用之间保持状态的事物。就像格式化日期一样。

      话虽如此,时间操作非常简单。 获取当前时间非常简单:

      Date currentDate = new Date();
      

      Calendar currentCal = Calendar.getInstance();
      

      如果你知道时区之间的差异,日历也可以用于roll Calendar.HOUR_OF_DAY(如有必要,还可以Calendar.MINUTE)。

答案 3 :(得分:0)

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

#2取决于具体情况。如果控制器必须等待另一个线程完成发送电子邮件任务之前它可以继续,那么根本没有速度改进 - 实际上会有速度丢失< / em>由于上下文切换和同步。如果控制器可以为另一个请求提供服务,或者如果它可以与电子邮件发送线程并行执行其他操作,则可以获得收益。

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