Java应用程序是如何装备的?
Java应用程序是如何装备的?
我从书籍《核心Java第1卷》中读到以下内容:\n每个Java应用程序都以一个在主线程中运行的
补充1
\n下面的链接详细解释了Swing框架如何使用线程。\nSwing中的并发性\nhttp://docs.oracle.com/javase/tutorial/uiswing/concurrency/index.html
Java应用程序是如何装备的?
当运行一个Java应用程序时,除了主线程外,还会有其他一些线程存在。这些线程在Java虚拟机中被称为"守护线程"。守护线程不会阻止Java进程退出,即使它们没有完成。因此,主线程是唯一的非守护线程。
以下是一些常见的守护线程:
1. Attach Listener
2. Finalizer
3. Reference Handler
4. Signal Dispatcher
有时还会出现以下守护线程:
5. Monitor Ctrl-Break
6. DestroyJavaVM
需要注意的是,Swing事件分发线程不属于守护线程,它只有在使用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()); } }
这段代码将打印出所有活动线程的名称。
总之,Java应用程序装备了一些守护线程来执行特定的任务,这些线程对应用程序的正常运行非常重要。我们应该接受它们的存在,并理解它们对应用程序的作用。
Java应用程序的装备方式是怎样的?这个问题的出现原因是因为有人想要了解Java应用程序的内部实现。以下是关于Java应用程序装备方式的相关内容:
根据HotSpot的实现,Java应用程序的装备方式是由以下几个线程组成:
1. VM线程:等待需要JVM进入安全点的操作。这些操作必须在JVM处于安全点时进行,以防止对堆的修改。这个线程执行的操作包括"stop-the-world"垃圾回收、线程堆栈转储、线程挂起和偏向锁撤销。
2. 定时任务线程:负责计时器事件(即中断),用于调度定期操作的执行。
3. 垃圾回收线程:支持JVM中发生的不同类型的垃圾回收活动。
4. 编译器线程:在运行时将字节码编译为本地代码。
5. 信号分发器线程:接收发送给JVM进程的信号,并通过调用适当的JVM方法在JVM内部处理它们。
除了这些线程,Java应用程序还可以创建其他线程。
OpenJDK对其运行时系统的描述(旨在模仿HotSpot)也描述了相同的线程组成部分。它提到,即使执行一个简单的“Hello World”程序,也会创建一打以上的线程,包括内部VM线程和库相关线程(如引用处理器和终结器线程)。主要的VM线程类型包括:
1. VM线程:执行VM操作的单实例。
2. 定时任务线程:模拟定时器中断,用于在VM内部执行定期操作的单实例。
3. 垃圾回收线程:支持并行和并发垃圾回收的不同类型的线程。
4. 编译器线程:将字节码即时编译为本地代码的线程。
5. 信号分发器线程:等待进程指定信号并将其分派到Java级别的信号处理方法的线程。
Oracle没有找到任何相关描述来确认他们的实现是否相同。但是,来自Paul Hohenesee在Sun的演讲中的这些幻灯片提到了以下线程类型:
1. Java线程(也称为mutator)。
2. 一个VM线程:用于GC、去优化等操作。
3. 编译器线程。
4. 观察者线程和定时器线程。
5. 低内存监视器。
6. 垃圾收集器,包括并行收集器。
虽然这个演讲可能已经至少6年了,但实现可能略有变化,但组件基本相同。
建议还可以参考OpenJDK源代码,例如sun.jvm.hotspot.runtime.WatcherThread.java等。
Java应用程序的装备方式是通过一系列不同类型的线程来实现特定的功能。这些线程负责执行垃圾回收、编译字节码、处理信号等操作,以保证Java应用程序的正常运行。