使用ExecutorService运行新线程时在Spring Boot线程中休眠

时间:2018-02-06 09:25:07

标签: java multithreading rest spring-boot executorservice

我使用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返回响应,并且传入的数据包侦听器继续运行。所以看起来比侦听任务在一个新线程中运行,但是在休眠当前线程时它也会使另一个线程被挂起。

0 个答案:

没有答案