3

我正在使用 ServletContextListener 创建一个新线程。

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import java.util.concurrent.*;

    public class Port implements ServletContextListener {
        private ExecutorService executor;

        public void contextDestroyed(ServletContextEvent event) {
            executor.shutdown();

        }

        public void contextInitialized(ServletContextEvent event) { 
            // start task
            executor = Executors.newSingleThreadExecutor();
            executor.submit(new Task()); //task should implement Runnable!

        }
    }

在这个线程中,我正在从串行端口(SerialPortEventListener)读取数据。task.class 应该在服务器处于活动状态的整个期间从串行端口读取信息。我把它扔到了一个线程中,因为只能有一个从串行端口读取的实例;然后应将数据共享给所有客户端。

现在我想访问这个线程从串口读取的数据。

这可以做到吗?如果是,那怎么办?

4

3 回答 3

2

例如,您可以将读取的数据存储在 servlet 上下文属性中。然后,从其他类中,您将从 servlet 上下文中获取属性:

public void contextInitialized(final ServletContextEvent event) { 
        // start task
        executor = Executors.newSingleThreadExecutor();
        executor.submit(new Runnable() {
            @Override
            public void run() {
                String data = readFromPort();
                event.getServletContext().setAttribute("serialPortData", data); 
            }
        });
    }
}
于 2013-03-02T17:47:19.100 回答
2

是的,它可以做到,而且你有几个选择:

1-在线程内部使用共享的concurrent.BlockingQueuewhere添加新数据,SerialPort并在您的servlet中从该队列读取

2- 在您的 servlet 中有一个事件侦听器对象并将其传递给您的task构造函数。侦听器对象应该有一个回调函数,在SerialEvent发生时调用。

一般来说,这是一个典型的生产者/消费者模式

于 2013-03-02T17:48:44.670 回答
0

您需要在要创建的新 Runnable 中共享数据。您可以向它添加一个并发集合

于 2013-03-02T17:48:13.993 回答