[英]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.