一个Java应用程序是如何配备的?
How is a Java application equipped?
我从 < Core Java vol. 这本书中阅读了下面的内容。 1 >:
Every Java application starts with a main method that runs in the main
thread. In a Swing program, the main thread is short-lived. It
schedules the construction of the user interface in the event dispatch
thread and then exits...Other threads, such as the thread that posts
events into the event queue, are running behind the scenes, but those
threads are invisible to the application programmer.
给我的感觉是,每个 Java 程序都由具有 一组标准线程 的 JVM 容纳。我认为它们包括:
- 一个主线程
- 一个事件调度线程
我猜这些线程就像其他资源一样,例如堆 space、JVM 授予每个 Java 应用程序的堆栈。客户应该在不同的线程中正确地做不同的工作。比如只在事件派发线程.
做Swing相关的事情
我说得对吗?我在哪里可以找到一些权威参考? JVM 规范似乎没有这个。
如果我从不使用事件分派线程,例如在控制台应用程序中,我可以禁用它以节省一些 CPU 周期吗?
加 1
下面link详细解释了Swing框架如何使用线程。
Swing 中的并发
http://docs.oracle.com/javase/tutorial/uiswing/concurrency/index.html
看来这是实现定义的,但是 HotSpot has the following:
VM thread
This thread waits for operations to appear that require the JVM to reach a safe-point. The reason these operations have to happen on a separate thread is because they all require the JVM to be at a safe point where modifications to the heap can not occur. The type of operations performed by this thread are "stop-the-world" garbage collections, thread stack dumps, thread suspension and biased locking revocation.
Periodic task thread
This thread is responsible for timer events (i.e. interrupts) that are used to schedule execution of periodic operations
GC threads
These threads support the different types of garbage collection activities that occur in the JVM
Compiler threads
These threads compile byte code to native code at runtime
Signal dispatcher thread
This thread receives signals sent to the JVM process and handle them inside the JVM by calling the appropriate JVM methods.
除了您的代码生成的任何线程。
编辑以回应赏金(你是对的,有些人的博客支持很不稳定,虽然这是我能找到的最好的地方)--- OpenJDK 对其 runtime system 的描述(旨在成为 HotSpot 的副本)描述了同样的事情:
People are often surprised to discover that even executing a simple “Hello World” program can result in the creation of a dozen or more threads in the system. These arise from a combination of internal VM threads, and library related threads (such as reference handler and finalizer threads). The main kinds of VM threads are as follows:
VM thread: This singleton instance of VMThread is responsible for executing VM operations...
Periodic task thread: This singleton instance of WatcherThread simulates timer interrupts for executing periodic operations within the VM
GC threads: These threads, of different types, support parallel and concurrent garbage collection
Compiler threads: These threads perform runtime compilation of bytecode to native code
Signal dispatcher thread: This thread waits for process directed signals and dispatches them to a Java level signal handling method
我无法从 Oracle 中找到任何参考资料来确认它们的实现是相同的,但是 these slides 来自 Paul Hohenesee 在 Sun 的演讲中提到:
Thread types
Java, aka mutator
One VM thread: GC, deoptimization, etc.
Compiler
Watcher, timer
Low memory monitor
Garbage collector, parallel collectors
鉴于此演示文稿必须至少有 6 年历史,实施可能略有变化,但组件或多或少相同。
这实际上是一个 JVM 实现问题,JVM 规范没有规定。您可以假设每个 JVM 为您的应用程序提供至少 1 个线程,即主线程。事件调度线程是特定于 Swing 的。
另请参阅线程 javadoc javadoc 。
1) Every swing application is a java application.
但是,
2) Not every java application is a swing application.
也就是说 每个 java 应用程序都由 JVM 提供了一个主线程。
在 添加 中,由于 swing 规范(Java Swing APIs and Developer Guide).
只要您不导入不需要的 API,就不必为停止不必要启动的线程而头疼。
除了其他答案:为什么不尝试一些带有一些实用程序的程序来打印线程。有API枚举主线程组和子线程组(实际上是全部)。使用以下应用程序执行此操作:
- 有一个主要的,没有别的
- main 以及其他一些方法和对象
- main 有一个 class,它有自己的线程
- 初始化挥杆的主要部分UI
- 具有简单 jsp 测试页的网络应用程序
查看所有线程的代码 (there are other ways but this one is good to get a understanding and will work fine in most apps I have tried, there is also )
仅供参考,Web 应用程序可以启动一个 swing ui - 尽管只有当它只对管理员和单例执行时才有用,因为 UI 会显示在服务器上。如果它为应用程序的每个用户都设置 UI,它会很快 ui 内存不足 运行 并且对于登录到服务器的任何人来说都很烦人(假设服务器有 UI/桌面)。因此,虽然可能,但不包括网络应用程序 + swing。
这是打印活动线程的简单方法:
import java.util.Set;
public class ListThreads
{
public static void main(String[] args) throws InterruptedException
{
Set<Thread> threadSet = Thread.getAllStackTraces().keySet();
for (Thread thread : threadSet)
System.out.println(thread.getName());
}
}
除了你的主线程,你会看到a couple of other threads:
- 附加监听器
- 终结器
- 引用处理程序
- 信号调度器
有时也是其中之一:
- 监控 Ctrl-Break
- 销毁JavaVM
这些线程是 "daemon threads",这意味着它们不会阻止您的 java 进程退出,即使它们没有完成。因此,您的 "main" 线程是唯一的非守护线程。
Swing event dispatcher thread不是其中之一,默认不会启动。它只会在您开始使用 Swing 组件后启动。
所有这些线程都是至关重要的。只是接受他们的存在。它们对你有好处。
我猜这些线程就像其他资源一样,例如堆 space、JVM 授予每个 Java 应用程序的堆栈。客户应该在不同的线程中正确地做不同的工作。比如只在事件派发线程中做Swing相关的事情
@Patrick 提到的常见 JVM 线程是在运行时初始化期间(由 JVM)生成的,然后用户程序开始执行并在 JVM 中执行 maintenance/housekeeping 作业。
customer
即用户线程,从应用程序代码中产生,不能直接控制系统级线程。并非所有类型的 java 程序都在执行 Swing 相关代码时启动 Swing 相关线程。
我说得对吗?我在哪里可以找到一些权威参考? JVM规范似乎没有这个。
除了@Patrick 提到的 link 之外,请检查以下 link:
如果我从不使用事件分派线程,例如在控制台应用程序中,我可以禁用它以节省一些 CPU 周期吗?
事件调度线程是在执行 Swing 应用程序的情况下创建的。您只能控制由用户应用程序创建的线程,而不能控制 JVM 运行时线程。
如果我从不使用事件分派线程,例如在控制台应用程序中,我可以禁用它以节省一些 CPU 周期吗?
回答: 除非您的 java 应用程序是 swing 应用程序,否则不会启动事件分派线程。所以你可以安全地假设你的 java 没有使用事件调度线程
即将加入话题:
每个线程都是一个进程,你写的一个程序可以分成很多个进程。
进程可以定义为正在执行的程序。
线程主要用于并行编程(不要与并发编程混淆)。线程也可以是软件定义的或硬件(处理器"dynamic")。您在这里谈论的线程是软件定义的线程,您从不关心硬件定义的线程。如果您使用的处理器是多核处理器,那么根据 Tomasulo 的算法
,不同的线程可能 运行 在不同的内核或同一内核上
我从 < Core Java vol. 这本书中阅读了下面的内容。 1 >:
Every Java application starts with a main method that runs in the main thread. In a Swing program, the main thread is short-lived. It schedules the construction of the user interface in the event dispatch thread and then exits...Other threads, such as the thread that posts events into the event queue, are running behind the scenes, but those threads are invisible to the application programmer.
给我的感觉是,每个 Java 程序都由具有 一组标准线程 的 JVM 容纳。我认为它们包括:
- 一个主线程
- 一个事件调度线程
我猜这些线程就像其他资源一样,例如堆 space、JVM 授予每个 Java 应用程序的堆栈。客户应该在不同的线程中正确地做不同的工作。比如只在事件派发线程.
做Swing相关的事情我说得对吗?我在哪里可以找到一些权威参考? JVM 规范似乎没有这个。
如果我从不使用事件分派线程,例如在控制台应用程序中,我可以禁用它以节省一些 CPU 周期吗?
加 1
下面link详细解释了Swing框架如何使用线程。
Swing 中的并发 http://docs.oracle.com/javase/tutorial/uiswing/concurrency/index.html
看来这是实现定义的,但是 HotSpot has the following:
VM thread
This thread waits for operations to appear that require the JVM to reach a safe-point. The reason these operations have to happen on a separate thread is because they all require the JVM to be at a safe point where modifications to the heap can not occur. The type of operations performed by this thread are "stop-the-world" garbage collections, thread stack dumps, thread suspension and biased locking revocation.
Periodic task thread
This thread is responsible for timer events (i.e. interrupts) that are used to schedule execution of periodic operations
GC threads
These threads support the different types of garbage collection activities that occur in the JVM
Compiler threads
These threads compile byte code to native code at runtime
Signal dispatcher thread
This thread receives signals sent to the JVM process and handle them inside the JVM by calling the appropriate JVM methods.
除了您的代码生成的任何线程。
编辑以回应赏金(你是对的,有些人的博客支持很不稳定,虽然这是我能找到的最好的地方)--- OpenJDK 对其 runtime system 的描述(旨在成为 HotSpot 的副本)描述了同样的事情:
People are often surprised to discover that even executing a simple “Hello World” program can result in the creation of a dozen or more threads in the system. These arise from a combination of internal VM threads, and library related threads (such as reference handler and finalizer threads). The main kinds of VM threads are as follows:
VM thread: This singleton instance of VMThread is responsible for executing VM operations...
Periodic task thread: This singleton instance of WatcherThread simulates timer interrupts for executing periodic operations within the VM
GC threads: These threads, of different types, support parallel and concurrent garbage collection
Compiler threads: These threads perform runtime compilation of bytecode to native code
Signal dispatcher thread: This thread waits for process directed signals and dispatches them to a Java level signal handling method
我无法从 Oracle 中找到任何参考资料来确认它们的实现是相同的,但是 these slides 来自 Paul Hohenesee 在 Sun 的演讲中提到:
Thread types
Java, aka mutator
One VM thread: GC, deoptimization, etc.
Compiler
Watcher, timer
Low memory monitor
Garbage collector, parallel collectors
鉴于此演示文稿必须至少有 6 年历史,实施可能略有变化,但组件或多或少相同。
这实际上是一个 JVM 实现问题,JVM 规范没有规定。您可以假设每个 JVM 为您的应用程序提供至少 1 个线程,即主线程。事件调度线程是特定于 Swing 的。
另请参阅线程 javadoc javadoc 。
1) Every swing application is a java application.
但是,
2) Not every java application is a swing application.
也就是说 每个 java 应用程序都由 JVM 提供了一个主线程。
在 添加 中,由于 swing 规范(Java Swing APIs and Developer Guide).
只要您不导入不需要的 API,就不必为停止不必要启动的线程而头疼。
除了其他答案:为什么不尝试一些带有一些实用程序的程序来打印线程。有API枚举主线程组和子线程组(实际上是全部)。使用以下应用程序执行此操作:
- 有一个主要的,没有别的
- main 以及其他一些方法和对象
- main 有一个 class,它有自己的线程
- 初始化挥杆的主要部分UI
- 具有简单 jsp 测试页的网络应用程序
查看所有线程的代码 (there are other ways but this one is good to get a understanding and will work fine in most apps I have tried, there is also )
仅供参考,Web 应用程序可以启动一个 swing ui - 尽管只有当它只对管理员和单例执行时才有用,因为 UI 会显示在服务器上。如果它为应用程序的每个用户都设置 UI,它会很快 ui 内存不足 运行 并且对于登录到服务器的任何人来说都很烦人(假设服务器有 UI/桌面)。因此,虽然可能,但不包括网络应用程序 + swing。
这是打印活动线程的简单方法:
import java.util.Set;
public class ListThreads
{
public static void main(String[] args) throws InterruptedException
{
Set<Thread> threadSet = Thread.getAllStackTraces().keySet();
for (Thread thread : threadSet)
System.out.println(thread.getName());
}
}
除了你的主线程,你会看到a couple of other threads:
- 附加监听器
- 终结器
- 引用处理程序
- 信号调度器
有时也是其中之一:
- 监控 Ctrl-Break
- 销毁JavaVM
这些线程是 "daemon threads",这意味着它们不会阻止您的 java 进程退出,即使它们没有完成。因此,您的 "main" 线程是唯一的非守护线程。
Swing event dispatcher thread不是其中之一,默认不会启动。它只会在您开始使用 Swing 组件后启动。
所有这些线程都是至关重要的。只是接受他们的存在。它们对你有好处。
我猜这些线程就像其他资源一样,例如堆 space、JVM 授予每个 Java 应用程序的堆栈。客户应该在不同的线程中正确地做不同的工作。比如只在事件派发线程中做Swing相关的事情
@Patrick 提到的常见 JVM 线程是在运行时初始化期间(由 JVM)生成的,然后用户程序开始执行并在 JVM 中执行 maintenance/housekeeping 作业。
customer
即用户线程,从应用程序代码中产生,不能直接控制系统级线程。并非所有类型的 java 程序都在执行 Swing 相关代码时启动 Swing 相关线程。
我说得对吗?我在哪里可以找到一些权威参考? JVM规范似乎没有这个。
除了@Patrick 提到的 link 之外,请检查以下 link:
如果我从不使用事件分派线程,例如在控制台应用程序中,我可以禁用它以节省一些 CPU 周期吗?
事件调度线程是在执行 Swing 应用程序的情况下创建的。您只能控制由用户应用程序创建的线程,而不能控制 JVM 运行时线程。
如果我从不使用事件分派线程,例如在控制台应用程序中,我可以禁用它以节省一些 CPU 周期吗?
回答: 除非您的 java 应用程序是 swing 应用程序,否则不会启动事件分派线程。所以你可以安全地假设你的 java 没有使用事件调度线程
即将加入话题: 每个线程都是一个进程,你写的一个程序可以分成很多个进程。 进程可以定义为正在执行的程序。 线程主要用于并行编程(不要与并发编程混淆)。线程也可以是软件定义的或硬件(处理器"dynamic")。您在这里谈论的线程是软件定义的线程,您从不关心硬件定义的线程。如果您使用的处理器是多核处理器,那么根据 Tomasulo 的算法
,不同的线程可能 运行 在不同的内核或同一内核上