我知道线程是软件/ Web应用程序的关键成员。 但是我在大学项目期间没有使用它们,这是关于使用Java EE技术的在线购物。
如果我在项目中应用它们,有人能告诉我它们有用吗?
我熟悉cuncurrency等,但只是想要了解他们的重要性。 例如,为什么我要把一些代码放在线程中(除了多个请求的事实,我应该打扰)。只是有点困惑。
答案 0 :(得分:3)
如果您已经完成了Java EE项目,那么线程就是您不太可能触及的内容。使用Java EE时,您将编写将插入某个容器的部件。例如,您对EJB进行编码,应用程序服务器负责缓存这些并调用它们。您对持久性实体进行编码,应用程序服务器将为您提供持久性上下文并处理事务... 应用程序服务器将汇集多个线程来处理客户端请求。他们都是为你管理的,所以你真的没有看到它。因为你是在编写框架代码。
切换到Java SE,情况有所不同。如果您正在构建一个主要是从头开始的应用程序,可能使用一些库但不是真正的框架,那么在一个非平凡的应用程序中,您可能需要多线程。虽然知道如何或何时以最佳方式使用并发是你通过学习和经验学到的东西(“实践中的Java并发”一书在这里的工作方式),你基本上可以说任何时候都需要在执行其他工作的同时在后台完成,或者您的程序可以继续而无需等待某些调用返回,多线程可以发挥作用。
答案 1 :(得分:1)
由于您使用的是Java EE,因此它已经是一个多线程环境,这就是您不需要多线程的原因。
您必须知道对于每个请求来自您的servlet,每个请求都由容器以单独的线程处理。所以在后台你正在使用容器提供的多线程。
我不知道现在我要提供的例子是否与任何实际情况有关,但这只是为了理解:
说新的一年,您需要向您的所有注册用户发送一封电子邮件,告知您购物网站上的新年优惠。因此,您的数据库中可能有数千个或更多客户。所以你可以在这里使用线程执行以一些块发送电子邮件的任务,例如1000个客户,你可以使用10个线程,每个线程向100个客户发送电子邮件。注意:这只是我想到的场景。
答案 2 :(得分:1)
这实际上取决于背景。如果您正在编写Java机会,那么您就在服务器上。如果是这样,您的应用程序服务器通常会管理线程。
客户端Java代码现在很少见,但仍然存在。例如,Swing中的线程对后台任务很重要,因此重绘/事件线程不会被阻止。
理解线程安全的概念可能比“何时使用线程”更重要。 Joshua Bloch的Effective Java是一本很好的书(很多年前我读过它)。
答案 3 :(得分:0)
(请记住,这与您选择使用的任何平台套件无关。)
想象一下,如果你愿意,你会去购物,而你的购物篮中并没有很多东西。还有大约十个人在你面前购物,他们中的许多人在他们的篮子里有很多东西。处理你需要花费更长的时间,当你没有那么多的结账车道必须处理的东西时,而不是打开另一条车道。
线程类似于商店中的结账通道。你拥有的越多,你可以执行的操作就越多。
随着计算机越来越快,越来越专注于将更多核心放到芯片上,作为软件工程师,我们必须想出各种方法,使我们的算法和应用程序更高效,以适应我们硬件的使用。多线程是一种方式。我们可以设计和实现算法来解决一个大问题并将其划分为更小的子问题,以便稍后重新组合。
线程的开销很大,这是在轻量级进程的上下文切换和旋转中。如果您只有一个核心,那么您将花费更多时间处理开销,而不是处理任何实际数据。
我已经分享了我对结帐通道的比喻,虽然他们打开了更多通常是好的,如果没有足够的工作让所有人都有理由让他们打开,那么他们& #39;浪费了资源和时钟周期。 critical 可以平衡您必须完成的工作量与您需要的线程数。
答案 4 :(得分:0)
我曾经有一个系统收到一个请求(只是一个HTTP帖子)来处理数据列表。对于每一位数据,它需要调用另一个系统并等待1-6秒以进行响应。 1000位数据需要几十分钟才能完成。 HTTP连接会超时。所以我使用并发一次向远程系统发出20或30个请求。我的系统大多只是等待。这使得总处理时间减少到之前的3%到5%,每个人都很高兴。
现在,请注意,在Java EE容器中使用Java SE并发功能是不合法的。容器正在进行各种多线程,您的多线程将会或可能会干扰。我们发现虽然我们违反了规则,但我们所做的工作仍然有效。在其他情况下,我已经尝试过,发现它不起作用。
如果您使用的是WebSphere或Weblogic Java EE容器,它们都有专有的框架来处理多线程。它是同一个,是一个提议的标准,但今天这个名字让我失望。
如果您使用的是像Tomcat这样的servlet容器,则可以使用Java SE多线程。
Spring Framework有一些实用程序类,您可以编程以满足某些并发需求。这使得将后备并发从Java SE切换到IBM和Oracle使用的框架变得容易。