【问题标题】:Java - creating threads in a EventListenerJava - 在 EventListener 中创建线程
【发布时间】:2013-02-06 19:51:30
【问题描述】:

我得到了这个代码:

Thread thread = new Thread(new Runnable() {
                    @Override
                    public void run() {
                        OctopusWSClient.sendPoolSensorReading(poolSensorReading, OctopusClientStart.currentMacAddress);
                    }
                });
                thread.setName("Thread - WS");
                thread.start();

在大约每 30 秒执行一次的事件侦听器中(当事件发生时),因此每 30 秒创建一个新线程,通常持续 20 秒才能完成,现在,我的问题是......以这种方式调用 Threads?,如果不是,如何???...而且,我正在使用以下代码查看 Threads ID 和名称:

Set<Thread> threadSet = Thread.getAllStackTraces().keySet();
                for(Thread t : threadSet){
                    System.out.println(" Thread #"+t.getId()+" Name: "+t.getName());
                }

它会打印当前线程的 ID 和名称,我看到的线程数总是相同,但 ID 总是递增 1(线程 - WS)。

这是一个坏信号吗?它会在一段时间内填满 JVM 内存吗?

谢谢

【问题讨论】:

  • sendPoolSensorReading 是静态方法,不实现 Runnable
  • 您可以改用executor service
  • 这就是线程池的设计目的。它们消除了永久构造和销毁线程的开销。

标签: java multithreading jvm runtime


【解决方案1】:

您可能会发现通知单个线程恢复比创建多个线程更好。如果需要 20 秒才能完成,最后将其锁定并使其等待,直到它从事件侦听器获得重新启动循环的命令。

【讨论】:

  • 加入队列以允许回填和好主意
  • 这实际上会更好,以防万一在任何时候花费很长时间都会有时间偏移。
  • 我不明白,你能帮我举个小例子吗,谢谢
  • 我很快就搞定了一些事情:link。我在那里使用了Scanner,以检查“操作”是否继续。你应该可以解决这个问题。
  • 没问题!很高兴我能帮上忙。
猜你喜欢
  • 2012-07-04
  • 2019-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-08
  • 1970-01-01
相关资源
最近更新 更多