我正在使用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应该在服务器处于活动状态的整个期间从串口读出信息。我把它扔进了一个线程,因为只能有一个实例从串口读取;然后应该将数据共享给所有客户。
现在我想访问此线程从串口读取的数据。
可以这样做吗?如果是,那么如何?
答案 0 :(得分: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);
}
});
}
}
答案 1 :(得分:2)
是的,可以做到,而你几乎没有选择:
1-使用共享concurrent.BlockingQueue
在线程内部添加来自SerialPort
的新数据以及从该队列中读取的servlet
2-在servlet中有一个事件监听器对象,并在task
构造函数中传递它。侦听器对象应该具有在SerialEvent
发生时调用的回调函数。
通常,这是典型的生产者/消费者模式
答案 2 :(得分:0)
您需要在您要创建的新Runnable中共享数据。您可以添加concurrent collection。