【发布时间】:2010-06-14 18:22:20
【问题描述】:
关于我的应用程序中许多控制器/servlet 中使用的两种方法,我只有两个问题:
1-在 util 类中调用静态方法或非静态方法(如处理日期的方法,即获取当前时间,在时区之间转换)有什么区别,哪个更好? 2-直接在控制器中调用方法(包含太多逻辑,例如发送电子邮件)或在不同线程中运行此方法有什么区别?
【问题讨论】:
标签: java multithreading static-methods
关于我的应用程序中许多控制器/servlet 中使用的两种方法,我只有两个问题:
1-在 util 类中调用静态方法或非静态方法(如处理日期的方法,即获取当前时间,在时区之间转换)有什么区别,哪个更好? 2-直接在控制器中调用方法(包含太多逻辑,例如发送电子邮件)或在不同线程中运行此方法有什么区别?
【问题讨论】:
标签: java multithreading static-methods
1)
2)
【讨论】:
使用静态方法有利有弊:
优点:
缺点:
根据我的个人经验,静态方法非常适合不需要您在调用之间保持状态的事情。比如格式化日期。
话虽如此,时间操作还是很简单的。 获取当前时间很简单:
Date currentDate = new Date();
或
Calendar currentCal = Calendar.getInstance();
如果您知道时区之间的差异,日历也可以用于roll Calendar.HOUR_OF_DAY(和Calendar.MINUTE)。
【讨论】:
1:所以static关键字只告诉你方法的可访问性。如果方法是static,则无需实例化对象即可访问它。所以问哪个更好:静态还是非静态是没有意义的。
2:在单独的线程上调用具有一些耗时逻辑的方法可以让您的主线程继续处理其他一些重要的事情。因此,如果您需要为客户端执行两个耗时的任务,那么在单独的线程上运行这两个任务可以更快地完成工作。
请注意,所有这一切都是假设程序员知道如何进行正确的线程处理...如果线程处理不正确,那么可能会出现一系列问题:死锁、无效的对象状态、性能下降等。
【讨论】:
#1 似乎在其他回复中得到了很好的回答。
#2 视情况而定。如果控制器必须等待其他线程完成发送电子邮件任务之前,它可以继续,那么根本没有速度提升——事实上会有速度损失 由于上下文切换和同步。如果控制器可以为另一个请求提供服务,或者如果它可以与电子邮件发送线程并行执行其他操作,那么就会有收获。
通常,如果控制器需要发送电子邮件,它会将工作交给工作线程,然后继续并行处理并处理下一个请求。这更快,但这意味着如果电子邮件发送失败,则无法向呼叫者报告问题。
【讨论】: