簡體   English   中英

從線程中讀取數據(在Servlet中)

[英]Reading data from a thread ( in a Servlet)

我正在使用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); 
            }
        });
    }
}

是的,它可以完成,你幾乎沒有選擇:

1-使用共享的concurrent.BlockingQueue ,其中在線程內部從SerialPort添加新數據並在servlet中從該隊列中讀取

2-在servlet中有一個事件監聽器對象,並在task構造函數中傳遞它。 偵聽器對象應具有在發生SerialEvent時調用的回調函數。

通常,這是典型的生產者/消費者模式

您需要在要創建的新Runnable中共享數據。 您可以向其添加並發集合

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM