アプリ版:「スタンプのみでお礼する」機能のリリースについて

Java初心者です。Javaでは、「ボタンをクリックする」など特定のイベントが発生した時に所定のメソッドを実行する「イベントリスナー」という監視機能があるそうですが、ボタンやマウスの操作の代わりに、「リアルタイムで変動する特定の変数の値がある値を超えたら所定の処理を実行する」という「イベントリスナー」の設定って、できるのでしょうか? これができれば、サーバアプリではないですが、その特定の変数につき常駐監視(常駐化)を行えることになり、起動時の遅さは問題ではなくなるように思うのですが。ネットで調べた限りでは、ボタンやマウスのケースしか紹介されていませんでした。何かヒントをいただけたら、うれしいです。

A 回答 (4件)

>「リアルタイムで変動する特定の変数の値が


>ある値を超えたら所定の処理を実行する」という
>「イベントリスナー」の設定って、できるのでしょうか? 

他の質問でも書きましたがJavaは魔法の杖では
ないので、何かを監視するには監視するプログラムが
必要です。イベントとイべントリスナは単にイべントを
コールバックで受け渡すやり方であって、
機能じゃありません。

で、「変数」って具体的に何者ですか?
    • good
    • 0
この回答へのお礼

tknakamuri様、ご回答ありがとうございます。

イべントリスナについての理解が間違っていたようです。勉強し直します。

>で、「変数」って具体的に何者ですか?
何でもいいのですが、たとえば株価を入れる変数などです。

お礼日時:2016/07/16 20:57

そういうGUI用のクラスに、「○○だったら××イベントを発生させる」という処理が実装されているだけです。


そういう処理が実装されていないクラスからはイベントは発生しません。

> 特定の変数につき常駐監視(常駐化)を行えることになり、起動時の遅さは問題ではなくなるように思う

これが何のことだかわかりません。

programA: 常駐して、イベントを受けとったら処理をする常駐プログラム
programB; 「リアルタイムで変動する特定の変数の値」を取得するプログラム
として、programAの常駐有無に係らず、 値の取得には「programBの起動」が必要で、その際の「起動の遅さ」が変わるわけではありません。
    • good
    • 0
この回答へのお礼

kmee様、ご回答ありがとうございます。

>programA: 常駐して、イベントを受けとったら処理をする常駐プログラム
>programB; 「リアルタイムで変動する特定の変数の値」を取得するプログラム
>として、programAの常駐有無に係らず、 値の取得には「programBの起動」が必要で、その際の「起動の遅さ」が変わるわけではありません。

はい、説明が不足しておりました。たとえば、リアルタイムで変動する変数を株価とした場合、おっしゃるとおり株価を取得するprogramBは既に起動されていて、起動の遅さは関係ありません。ただ、たとえばprogramAをロジック判定のプログラム(株価が所定の条件を満たしているかを監視し、満たした瞬間に自動的に注文を出すなど)とし、かつprogramAが現在常駐監視型でない場合、たとえば同じprogramAを一秒間に100回実行することで、10ミリ秒ちょい遅れで株価の動きに反応できると思います。ところが、programAをJavaで書いた場合、バイトコードからネイティブオブジェクトコードに毎回変換してから実行されるので、一秒間に100回バイトコードからオブジェクトコードに変換するという無駄な処理が発生することになります。一日当たりだと8,640,000回の無駄な処理が発生します。これはあまりにも間抜けな話で、初めからネイティブオブジェクトコードにコンパイルできないのでは、この手のプログラムの開発には、JavaではなくC++などを使うべきだということになると思います。実際には、Javaで書いても、GCJを使えば、直接ネイティブオブジェクトコードにコンパイルできるそうですが、まだエラーが解決できておりません。

このような状況で、programAを常駐監視型にできれば、programB同様、初めに一回起動しておけば、ずーと判定作業を続けてくれると思いました。つまり、私は、どうすれば常駐監視型programAを開発できるのかを知りたかったのです。私はJava初心者なので、イベントリスナーを使えばprogramAが常駐監視型になってくれるのかなと思ってしまっただけです。

繰り返しになりますが、結局私の知りたいことは、どうすれば常駐監視型programAを開発できるのかに尽きます。何かヒントをいただけましたら、うれしいです。

お礼日時:2016/07/16 21:08

>一秒間に100回バイトコードからオブジェクトコードに


>変換するという無駄な処理が発生することになります。
>一日当たりだと8,640,000回の無駄な処理が発生します。

一秒間に100回起動するプログラムがお望みなんでしょうか?
これで問題になるのはおそらく JITよりも VMの起動コストの
方だと思いますが、C++だってプロセスを1秒回に100回
起動すればそれなりの負荷は発生します。毎回同じコードを
メモリにロードするのも同様にばかげた話です。

で、そういうことなら、常駐プログラムを書くだけです。

Linuxなら daemon、Windows なら service を書けば
よいです。

Apache Commons Daemon とかを使うと楽です。
    • good
    • 0
この回答へのお礼

tknakamuri様、ご回答ありがとうございます。

>Linuxなら daemon、Windows なら service を書けば
>よいです。
>Apache Commons Daemon とかを使うと楽です。

新しい知識。私にわかるかどうかわかりませんが、勉強してみます。

お礼日時:2016/07/19 23:47

一番単純なのは、



while(true){
 株価=株価を得る();
 if (指定した条件を満す(株価) ) {
  買う();
 }
}

等というような、一つのプログラムで全部できるようにしてしまうことです。
    • good
    • 0
この回答へのお礼

kmee様、ご回答ありがとうございます。

>一つのプログラムで全部できるようにしてしまうことです

初歩的な質問で申し訳ありません。その例の書き方をすれば、初めに一回起動しておけば、ずーと判定作業を続けてくれる常駐型になるのですか。なにはともあれ、やってみます。

あと、よく考えてみると、株価を取得するプログラム(programB)も、常駐していて証券会社のシステム(サーバ)上の株価が変わった時に、それをフィードし、こちら(クライアント)の株価を書き換えています。変数値を監視し、条件を満たせば自動的に注文を出すprogramAも、それを真似して書けるような気もします。幸い、株価を取得するプログラム(programB)はソースコードもあるので、それを理解する努力をしてみようとも思っています。

お礼日時:2016/07/19 23:49

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!