Java应用程序是如何装备的?

14 浏览
0 Comments

Java应用程序是如何装备的?

我从书籍《核心Java第1卷》中读到以下内容:\n每个Java应用程序都以一个在主线程中运行的开始。在Swing程序中,主线程的生命周期很短。它在<事件调度线程>中安排用户界面的构建,然后退出...<其他线程>,如将事件发布到事件队列的线程,在后台运行,但这些线程对应用程序员是不可见的。\n这让我感觉到每个Java程序都由JVM提供了一组标准的线程。我认为它们包括:\n- 一个主线程\n- 一个事件调度线程\n我猜这些线程就像JVM为每个Java应用程序分配的堆空间、栈等其他资源一样。用户应该在不同的线程中正确地完成不同的工作。例如,只在事件调度线程中进行与Swing相关的操作。\n我对此正确吗?我在哪里可以找到一些权威的参考资料?JVM规范似乎没有这方面的内容。\n如果我从未使用过事件调度线程,比如在控制台应用程序中,我可以禁用它以节省一些CPU周期吗?\n

补充1

\n下面的链接详细解释了Swing框架如何使用线程。\nSwing中的并发性\nhttp://docs.oracle.com/javase/tutorial/uiswing/concurrency/index.html

0
0 Comments

每个Swing应用程序都是一个Java应用程序,但并不是每个Java应用程序都是Swing应用程序。也就是说,每个Java应用程序都由JVM提供了一个主线程。此外,每个Swing应用程序还由一个事件调度线程提供,这是由于Swing规范。只要你不导入不需要的API,就不需要为不必要启动的线程而头疼。

你提到了“Swing规范”。我从没想到会有这样的规范存在。我该在哪里找到它?谢谢。

我为你添加了一个链接。

0
0 Comments

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应用程序装备了一些守护线程来执行特定的任务,这些线程对应用程序的正常运行非常重要。我们应该接受它们的存在,并理解它们对应用程序的作用。

0
0 Comments

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应用程序的正常运行。

0