0

から情報を読み取る Java の監視クライアントを投影しています/proc。メインクラスMonitoringClientProcParserクラスがあります。私のProcParser拡張しThreadます。

ProcParser多くの (CPU、メモリ、ディスク、ネットワークの 4 つ)オブジェクトをインスタンス化し、コンストラクターで測定したいコンポーネントの 1 つを渡すのは良い方法だと思いました。次に、run メソッドで、then を切り替えます。各オブジェクトは、そのうちの 1 つを解析します。コードは次のようになります。

ProcParser pp_Cpu = new ProcParser(UsageType.CPU, 1000, Pid.getPid());
ProcParser pp_Memory = new ProcParser(UsageType.MEMORY, 1000, Pid.getPid());
ProcParser pp_Disk = new ProcParser(UsageType.DISK, 1000, Pid.getPid());
ProcParser pp_Network = new ProcParser(UsageType.NETWORK, 1000, Pid.getPid());

ArrayList<String> cpuData = null;
ArrayList<String> memoryData = null;
ArrayList<String> diskData = null;
ArrayList<String> networkData = null;

pp_Cpu.start();
pp_Memory.start();
pp_Disk.start();
pp_Network.start();

for (;;) {
    if (pp_Cpu.isReady() && pp_Memory.isReady()
&& pp_Disk.isReady() && pp_Network.isReady()) {

        cpuData = pp_Cpu.getUsageData();
        memoryData = pp_Memory.getUsageData();
        diskData = pp_Disk.getUsageData();
        networkData = pp_Network.getUsageData();
    } else {
        sleep(1000); //this does not work. I have to extend to Thread also the main class?
    }
}

収集された値をときどき確認するにはどうすればよいですか? また、スレッド (メイン コンポーネントごとに 1 つ) を作成する方法は、Java スレッディングの観点から良いアプローチですか? 前もって感謝します。

ProcParser 内でメソッドを実行します。

@Override
    public void run() {
        if ((this.usageType == null) || (this.sleepTime < 0) || (this.processPid < 0)) {
            throw new IllegalArgumentException();
        }

        //Forever sleep and gather the usage values
        for (;;) {
            this.ready = false;
            switch (this.usageType) {
                case CPU:
                    this.gatherCpuUsage();
                    this.ready = true;
                    break;
                case MEMORY:
                    this.gatherMemoryUsage(this.processPid);
                    this.ready = true;
                    break;
                case DISK:
                    this.gatherDiskUsage();
                    break;
                case NETWORK:
                    this.gatherNetworkUsage();
                    break;
                case PARTITION:
                    this.gatherPartitionUsage();
                    break;
                default:
                    break;
            }
        }
    }
4

2 に答える 2

1

収集した値を時々確認するにはどうすればよいですか?

ProcParserスレッドがバックグラウンドで実行され、からCPUデータ(たとえば)を読み込んでから/procスリープすることを想定しています。の使用を検討することをお勧めしますAtomicReference。次のようなもの:

 private final AtomicReference<List<String>> cpuDataReference =
     new AtomicReference<List<String>>();
 ...

 ProcParser pp_Cpu =
     new ProcParser(UsageType.CPU, 1000, Pid.getPid(), cpuDataReference);
 ...

 // in your `ProcParser`
 List<String> cpuDataList = new ArrayList<String>();
 // read in the /proc files into the list
 ...
 // save it in the AtomicReference passed into the constructor
 dataReference.set(cpuDataList);

 // other threads could then get the latest list
 List<String> cpuDataList = cpuDataReference.get();

set()消費者がリストを変更することを心配している場合は、変更できないリストが必要になる場合があります。

スレッド(主要コンポーネントごとに1つ)を作成する方法は、Javaスレッドの観点から良いアプローチですか?

これが演習ではなかったとしたら、スレッドの複雑さは必要なかったと思います。つまり、あまり購入しません。スレッドが必要なタスク、作成するスレッドの数などを選択することは、これらの場合に行う必要のある重要な決定です。

一般的に、拡張するのではなく、ProcParser実装を作成することを検討してから、と言う必要があります。これが推奨されるパターンです。また、クラスから返されたクラスの使用も常に検討する必要があります。これらのスレッドプールはスレッドの管理を引き継ぎ、コードをはるかに単純にします。RunnableThreadnew Thread(new ProcParser(...))ExecutorServiceExecutors

于 2012-05-08T19:20:45.197 に答える
0

ポーリングする代わりに、とis_readyを調べます。を使用してメソッドを記述し、作業スレッドが結果を生成するときに準備が整うまで待機しているスレッドをウェイクアップするために使用できます。 Object.waitObject.notifyAllProcParser.waitUntilReadyObject.waitObject.notifyAll

または、パーサーがアイテムのリストを作成しているので、のプロデューサーコンシューマーキューを調べますjava.util.concurrent

于 2012-05-08T19:04:31.723 に答える