3

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 は、サーバーがアクティブである間、シリアル ポートから情報を読み取る必要があります。シリアル ポートから読み取るインスタンスは 1 つしかないため、これをスレッド内にスローしました。その後、データをすべてのクライアントで共有する必要があります。

ここで、このスレッドがシリアル ポートから読み取っているデータにアクセスしたいと思います。

これはできますか?はいの場合、どのように?

4

3 に答える 3

2

たとえば、読み取ったデータをサーブレット コンテキスト属性に格納できます。次に、他のクラスから、サーブレット コンテキストから属性を取得します。

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); 
            }
        });
    }
}
于 2013-03-02T17:47:19.100 に答える
2

はい、できます。オプションはほとんどありません。

1-共有スレッドを使用してconcurrent.BlockingQueue、スレッド内で新しいデータを追加SerialPortし、サーブレットでそのキューから読み取ります

2- サーブレット内にイベント リスナー オブジェクトを配置し、それをtaskコンストラクターに渡します。SerialEventリスナー オブジェクトには、発生時に呼び出されるコールバック関数が必要です。

一般に、これは典型的なプロデューサー/コンシューマーパターンです。

于 2013-03-02T17:48:44.670 に答える
0

作成する新しい Runnable でデータを共有する必要があります。これに並行コレクションを追加できます。

于 2013-03-02T17:48:13.993 に答える