我使用Spring Boot实现了API REST,用于某些用户界面,显示有关连接到网络的设备的信息。 API REST又使用DAO类,通过发送原始以太网帧并收集设备响应来收集信息。
所以我正在使用Pcap4j,在收听传入的数据包时,我发送了一个数据包。所以我在新线程中运行侦听处理程序:
ExecutorService pool;
Task task = new ListenerTask(); // Task implements Runnable
pool = Executors.newSingleThreadExecutor();
pool.execute(task);
然后我发送一些数据包然后睡觉:
.... //Send some packet
try {
LOGGER.log( Level.INFO, "Going to sleep" );
Thread.sleep(10 * 1000);
LOGGER.log( Level.SEVERE, "Awakening" );
Pool.shutdownNow();
} catch (InterruptedException e) {
e.printStackTrace();
}
但是在这10秒内睡觉时,正在执行侦听传入数据包的任务的新线程也会停止。
输出:
[pool-2-thread-1] o.p.c.PcapHandle : Starting loop.
[qtp238157928-40] d.p.u.TalkPcapHandler : Going to sleep
[qtp238157928-40] d.p.u.TalkPcapHandler : Awakening
[pool-2-thread-1] o.p.p.f.PacketFactories : Succeeded in FactoryBinder.getInstance()
[pool-2-thread-1] d.p.u.TalkDiscoverPacketListener : got Ethernet packet
在这10秒内,主线程(RestController Spring组件)处于休眠状态,侦听任务不处理任何数据包。如果删除睡眠指令,则Rest Controller返回响应,并且传入的数据包侦听器继续运行。所以看起来比侦听任务在一个新线程中运行,但是在休眠当前线程时它也会使另一个线程被挂起。