如何配备Java应用程序?

smw*_*dia 6 java jvm

我在下面的书中读到了<Core Java vol.1>:

每个Java应用程序都以在主线程中运行的main方法开始.在Swing程序中,主线程是短暂的.它在事件调度线程中调度用户界面的构造,然后退出... 其他线程(例如将事件发布到事件队列中的线程)在后台运行,但这些线程对于应用程序程序员是不可见的.

它让我觉得JVM使用一组标准线程来容纳每个Java程序.我认为它们包括:

  • 主线程
  • 事件派发线程

我想这些线程就像JVM授予每个Java应用程序的堆空间,堆栈等其他资源一样.客户应该在不同的线程中正确地完成不同的工作.比如只在事件派发线程中做与Swing相关的事情.

我对此是否正确?我在哪里可以找到一些权威参考?JVM规范似乎没有这个.

如果我从不使用事件调度线程,例如在控制台应用程序中,我可以禁用它来节省一些CPU周期吗?

加1

下面的链接解释了有关Swing框架如何使用线程的详细信息.

Swing中的并发性 http://docs.oracle.com/javase/tutorial/uiswing/concurrency/index.html

Pat*_*ins 7

看起来这是实现定义的,但HotSpot 具有以下内容:

VM线程

此线程等待出现需要JVM到达安全点的操作.这些操作必须在单独的线程上发生的原因是因为它们都需要JVM处于不能对堆进行修改的安全点.此线程执行的操作类型是"stop-the-world"垃圾收集,线程堆栈转储,线程挂起和偏向锁定撤销.

定期任务线程

该线程负责用于安排定期操作执行的定时器事件(即中断)

GC线程

这些线程支持JVM中发生的不同类型的垃圾回收活动

编译器线程

这些线程在运行时将字节代码编译为本机代码

信号调度程序线程

该线程接收发送到JVM进程的信号,并通过调用适当的JVM方法在JVM内处理它们.

除了您的代码生成的任何线程.

编辑以回应赏金(你是对的,有些人的博客是非常不稳定的支持,虽然它是我能找到所有摘要的最佳位置)--- OpenJDK对他们的运行时系统的描述(打算成为HotSpot的副本)描述了同样的事情:

人们常常惊讶地发现即使执行一个简单的"Hello World"程序也可能导致在系统中创建十几个或更多线程.它们来自内部VM线程和库相关线程(例如引用处理程序和终结器线程)的组合.主要的VM线程类型如下:

  • VM线程:VMThread的这个单例实例负责执行VM操作......

  • 定期任务线程:WatcherThread的这个单例实例模拟用于在VM内执行定期操作的定时器中断

  • GC线程:这些不同类型的线程支持并行和并发垃圾回收

  • 编译器线程:这些线程执行字节码到本机代码的运行时编译

  • 信号调度程序线程:该线程等待进程定向信号并将它们分派给Java级信号处理方法

我找不到Oracle的任何参考资料,以确认它们的实现方式是相同的,但是来自Sun的Paul Hohenesee的演示文稿中的这些幻灯片提到:

线程类型

  • Java,又名mutator

  • 一个VM线程:GC,去优化等

  • 编译器

  • 看守,计时器

  • 低内存监视器

  • 垃圾收集器,并行收集器

鉴于此演示文稿必须至少6年,实现可能略有改变,但组件或多或少相同.


bvd*_*vdb 6

这是打印活动线程的简单方法:

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());
  }
}
Run Code Online (Sandbox Code Playgroud)

除了你的主线程,你会看到其他一些线程:

  1. 附加监听器
  2. 终结
  3. 参考处理程序
  4. 信号调度员

有时其中一个也是:

  1. 监控Ctrl-Break
  2. DestroyJavaVM

这些线程是"守护程序线程",这意味着它们不会阻止您的Java进程退出,即使它们没有完成.所以,你的"主"线程是唯一的非守护进程线程.

Swing事件分派线程,是不是其中之一,并不会被默认启动.它只会在您开始使用Swing组件后启动.

所有这些线程都至关重要.只是接受他们的存在.它们对你有好处.


Ben*_*Win 5

1)每个swing应用程序都是一个java应用程序.

但,

2)并非每个java应用程序都是swing应用程序.

这就是说JVM为每个 java应用程序提供了一个主线程.

除了到每一次挥杆应用提供一个事件调度线程,由于摆动规范(的Java Swing API和开发者指南).

如果您不导入不需要的API,则无需担心停止不必要的启动线程.