痔になりやすい生活習慣とは?

レベルの低い質問だとは思うのですが、相談にのってください。

Javaでコンソールプログラムを作っています。

コマンドプロンプトを複数立ち上げ、同じJAVAプログラムを同時に実行します。(プログラムは同じですが、処理内容はそれぞれ異なります。並列な処理です。)
これら複数のプログラム同士でデータ(処理の進捗状況など)を共有するにはどうすればいいでしょうか。(そもそもそんなことができるのでしょうか)

今考えているのは、共有データ用のテキストファイルを1つ作り、それを各プログラムが参照(読んだり書き込んだり)する、ということ考えています。しかし、これだと複数のプログラム同士が同時にファイルを読み書きするようなタイミングがあるかもしれず、思ったような動作をしないかもしれません。

そこで、質問です。

(1)今回のような場合(コマンドプロンプトを複数立ち上げ、同じJAVAプログラムを同時に実行)で、データ共有に使えそうなトピックや方法があれば、お教えください。ヒントでもなんでもいいです。(とりあえず、ちょっとした付け焼刃でなんとか動いてほしいので……)

(2)「コマンドプロンプトを複数立ち上げ、同じJAVAプログラムを同時に実行」しているのは、単に私の技術が低いからです。今後プログラムを根本的に書き直して改良するために、今後どのようなJavaのトピックを勉強すればいいでしょうか。

乱文失礼いたしました。どうかよろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (3件)

>レベルの低い質問だとは思うのですが、相談にのってください。



「マルチスレッドって何ですか?」みたいな質問に比べたら全然、良質問だと思いますけど。(というより普段は全く質問しないため、こういう長文タイプが好ましかったりする。)

(1)の答え→
synchronizedブロック、java.lang.Objectクラスのwait/notify/notifyAllメソッド

マルチスレッドプログラミング 5章 スレッドの同期
5.2. スレッド間の待ち合わせ
http://www.techscore.com/tech/J2SE/Thread/5-2.html

(2)の答え→
ソケットプログラミング

JavaでHello World > ソケット編
http://www.hellohiro.com/socket.htm


HTTP通信によるサーブレットプログラミングなら、基本的にはややこしい所(各スレッドの制御など)は全て、Tomcatのようなサーブレットコンテナがちゃんと内部で処理してくれるのでいいかなあとは思うのですが、出力先がブラウザなどのGUIではなく、標準出力などのCUI上でいいのでしたらデータグラム通信やマルチキャストなどもありかな、と思います。
    • good
    • 0

(2)への回答です。



プログラムの内容が抽象的なので本当に実現できるかわかりませんが、「スレッド化」できるのではないかと思います。
現在2つ動かしているプログラムをスレッドとして動かします。
スレッドを起動したクラスにそれぞれのクラスが状態を報告するか、スレッド化するクラスにpublicメソッドをつけて、もうひとつ状態監視スレッドで定期的に確認することで実現できるのではないでしょうか。

1つのVMで動くので圧倒的に性能はいいですよ。
調査すべきキーワードは「スレッド」です。

参考URL:http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/ja …
    • good
    • 0

・ファイル共有


排他モードで(あるプログラムが読み書きしている間、他のプログラムはアクセスできない)短い時間で読み書きすれば、遅延は最小限で済みます。
・ネットワーク
どれか一つがサーバーになって、情報を保持します。他はクライアントになって、なんらかのプロトコル(独自に文字列を送受信するとか、いっそhttpでやるとか)で通信します。
・JMS
参考URL。メッセージを処理する専用のAPIがあります。JMSを処理するプロセスが別途必要。

参考URL:http://ja.wikipedia.org/wiki/Java_Message_Service
    • good
    • 0

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q違うクラスからの変数の共有化

一つのクラスの中にある変数の値を、二つの別なクラスから呼び出して、その二つのクラスのどちらから変数を参照しても同じ値が帰ってくるようにしたいのですが、いろいろ調べてもできなかったので質問させていただきますm(_ _)m

// 共有化させたい変数を持つクラス
// Var.java
public class Var{
 public static int i;

 public Var(int i){ this.i = i; }
 public Var(){}

 public static void getI(){
  return i;
 }
}

//クラス1
//Class1.java
public class Class1{
 Var var = new Var(1);
}

//クラス2
//Class2.java
public class Class2{
 Var var = new Var();

 System.out.println(var.getI());
}

とした場合、Class1を実行し、次にClass2を実行すると、クラス1で定義した変数の値である 1 が戻ってくるようにしたいのですが、上記の方法では、Class2を実行すると結果は 0 になってしまいました。
まだまだ習い始めたばかりでいまいちstaticを使い切れていないと思います・・・

たとえば、PrintStreamクラスの
public static final PrintStream out
というのはどこから参照しても同じ結果なのでそのようなやり方で大丈夫だろうと思ったのですが・・・

このような方法では共有化させることはできないのでしょうか?またできないのでしたらほかのやり方がもしあった場合は教えていただきたいと思います。
どうかお願いします。

一つのクラスの中にある変数の値を、二つの別なクラスから呼び出して、その二つのクラスのどちらから変数を参照しても同じ値が帰ってくるようにしたいのですが、いろいろ調べてもできなかったので質問させていただきますm(_ _)m

// 共有化させたい変数を持つクラス
// Var.java
public class Var{
 public static int i;

 public Var(int i){ this.i = i; }
 public Var(){}

 public static void getI(){
  return i;
 }
}

//クラス1
//Class1.java
public class Class1{
 Var var...続きを読む

Aベストアンサー

Class1 のインスタンス
Var var = new Var(1);
Class2 のインスタンス
Var var = new Var();
これは、それぞれ別物を指しています(だって、自分で new と書いて新しく生成しているじゃないですか!)。

Class1 で値を入れた static 領域を Class2 で参照するには、

public class Class2{
// Var は大文字(クラス名)
 System.out.println(Var.getI());
}

とします。「クラス名.staticメンバ」という書式です。ただし、共有されるためには同じ Java VM 上実行されることが条件です。

※参考
public Var(int i){ this.i = i; }
この書き方は実行はできますが、意味的には正しくありません。staticメンバ は new しないでアクセスされることが前提なので、
Var.setI(i);
Var.i = 1;
というような書き方が良いと思います(new はしません)。

Class1 のインスタンス
Var var = new Var(1);
Class2 のインスタンス
Var var = new Var();
これは、それぞれ別物を指しています(だって、自分で new と書いて新しく生成しているじゃないですか!)。

Class1 で値を入れた static 領域を Class2 で参照するには、

public class Class2{
// Var は大文字(クラス名)
 System.out.println(Var.getI());
}

とします。「クラス名.staticメンバ」という書式です。ただし、共有されるためには同じ Java VM 上実行されることが条件です。

※...続きを読む

Qmain()を持つクラスが2つ以上あるexecutable jar

main()を持つクラスが2つ以上あるexecutable jar
を作成して、
main()を持つクラスを
必要に応じて、起動仕分けることは
可能なのでしょうか?

もし、可能であるとすれば
マニフェストファイルには
どのように記述すればよいのでしょうか?

そして、
java -jar
コマンドで起動するときにどのようにすればよいのでしょうか?


不可能であれば不可能であるということを
教えてください。

以上

Aベストアンサー

マニフェストファイルを用意しなくても、クラス名を直接指定する通常のコマンド形式
java -classpath <jarファイル名> <mainがあるクラス名> <コマンドライン引数>
で <mainがあるクラス名> を変えれば起動仕分けることは可能です。

マニフェストファイルには Main-Class 属性を一つしか定義できないので、クラス名を指定しない
java -jar <jarファイル名> <コマンドライン引数>
の形式で起動仕分けることは出来ないと思います。


人気Q&Aランキング