在没有显式创建线程的情况下,简单的Java程序将如何表现?

时间:2018-07-02 08:03:45

标签: java multithreading

在没有显式创建线程的情况下,Java程序在操作方面如何表现?整个程序是否在单个过程中执行?还是隐式创建线程? 在学习线程以及线程如何在GUI交互中有用时,这个问题使我想到了,因为它允许用户与GUI交互,同时允许程序在后台执行操作。那么,这是否意味着一个简单的Java程序将运行一个进程,按顺序执行每一行而无需使用线程?

2 个答案:

答案 0 :(得分:2)

除非您通过instantiating one,使用executor明确地启动新线程或使用某种第三方库为您做这两者之一(例如大多数GUI库都这样做),否则UI不会像您所说的那样阻止整个事情),整个程序像您说的那样在单个线程上运行。

可能存在非显而易见的异常(例如使用streams,这是通用的执行程序),但这是一般规则。

答案 1 :(得分:0)

在Java程序中,可以使用以下语句来了解(或打印)应用程序正在运行的线程的名称:System.out.println(Thread.currentThread().getName());。一个简单的PrintHelloWorld程序将显示该程序在名为“ main”的线程上运行。此外,人们可以使用Thread的{​​{1}}方法来获取类似信息。

关于GUI应用程序(例如,Swing)中的线程:

GUI(图形用户界面)应用程序本质上是异步的。用户可以随时选择菜单项或按下按钮,并期望应用程序能够迅速响应。 Java Swing和AWT通过创建一个单独的线程来处理用户发起的事件并更新提供给用户的图形视图来解决此问题。

事件处理代码在称为事件调度线程(EDT)的特殊线程上运行。大多数调用Swing方法的代码也都在此线程上运行。大多数任务是事件处理方法的调用,例如toString()。事件分发线程上的任务必须快速完成;如果没有,则将备份未处理的事件,并且用户界面将变得无响应或死机。

其他任务可以由应用程序代码使用静态方法ActionListener.actionPerformedjavax.swing.SwingUtilities.invokeLater来安排。在Swing应用程序的EDT中使用这两种方法分别异步和同步执行代码。

可以通过调用静态方法invokeAndWait来确定GUI应用程序的代码是否在事件分发线程上运行。