Java 从线程读取数据(在Servlet中)

Java 从线程读取数据(在Servlet中),java,concurrency,Java,Concurrency,我正在使用ServletContextListener创建一个新线程 import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import java.util.concurrent.*; public class Port implements ServletContextListener { private ExecutorService execut

我正在使用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应该在服务器处于活动状态的整个期间从串行端口读取信息。我在线程中抛出了它,因为只能有一个实例从串行端口读取数据;然后,应将数据共享给所有客户端

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


这能做到吗?如果是,那么如何处理呢?

例如,您可以将读取的数据存储在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); 
            }
        });
    }
}

您需要在将要创建的新Runnable中共享数据。您可以添加一个。

是的,它可以完成,并且您有几个选项:

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

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


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

您是指servlet上下文属性吗?我确实有很多传感器数据;您认为与其他提供的解决方案(回调)相比,这样做是否有效?您没有告诉servlet应该访问哪些信息以及何时访问。如果数据被不断修改,我建议您将包含需要访问的数据的对象放在servlet上下文属性中(作为自定义对象)。从线程更新对象,并从servlet获取数据。确保所有内容都是线程安全的。在servlet中,我必须使用计时器来读取上下文属性?这听起来是个好主意。显然java没有回调函数,所以这看起来是个更好的主意。为什么要使用计时器?从contextInitialized方法中启动的线程更新数据。在servlet中,您从属性读取数据。你为什么需要计时器?您到底想在servlet中做什么?我想在servlet中使用串行事件侦听器听起来是更好的主意。但是我对java有点陌生。实现串行事件侦听器可能会起作用,但如何将此信息传递给servlet?只是通过回调函数中的一个参数?