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

时间:2013-03-02 17:41:35

标签: java concurrency

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

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

可以这样做吗?如果是,那么如何?

3 个答案:

答案 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