- PR -

Threadの一斉開始(完全同期)について

投稿者投稿内容
(株)ぽち
ぬし
会議室デビュー日: 2002/09/10
投稿数: 376
投稿日時: 2005-01-25 17:20
こんにちわ。

今あるツールを作っています。
目的としては、「完全に同期してリクエストを多重発行する」というものです。

ソースの一部を載せます。
コード:
	public static void main( String[] args ) {
		try {
			for ( int i=0; i<Integer.parseInt( args[0] ); i++ ) {
				HogeThread ht = new HogeThread( Thread.currentThread() );
				ht.start();
			}
			
			System.out.println( "準備OK" );
			BufferedReader in = new BufferedReader( new InputStreamReader( System.in ) );
			in.readLine();
			
			System.out.println( "実行!" );
			Thread.currentThread().yield();
		} catch ( Exception e ) {
			e.printStackTrace();
			
		}
	}



実行Thread側では単に時刻とメッセージを出しています。
また、処理実行直前で引数で得たThreadに対してjoin()しています。

上記を実行するとログ上
17:05:57,845:message
17:05:57,845:message
17:05:57,845:message
17:05:57,845:message
17:05:57,855:message
17:05:57,855:message
17:05:57,855:message
17:05:57,855:message
17:05:57,855:message

のようになります。

内部では順次Threadが開始されるらしく、完全に同時刻でのログは取れません。



理想してはログ上出る時刻が全て同時刻にしたいのですが、そもそもこのような
ことは可能なのでしょうか?

同時に、複数Threadに対して通知したいのですが。

wait/notifyあたりを使用するのでしょうか。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2005-01-25 17:31
スレッドの数だけCPUが存在しない限り完全に同時、というのはそもそも無理でしょう。
また、同時に各スレッドで処理が開始されていてもそれ以降の処理が必ずしも同じペースで進むことは保証されませんので実現は難しいかと想います。
リアルタイムを保証する Java の仕様もあるらしいですが・・・残念ながら私は疎いので知ったかぶりできません。
https://rtsj.dev.java.net/
(株)ぽち
ぬし
会議室デビュー日: 2002/09/10
投稿数: 376
投稿日時: 2005-01-25 17:54
書いたあとに、ログ出力に関する誤差などもあるので
完璧な同期ログは無理か、と思ったりもしました。

「完璧」は無しでOKにしても、私が示したコードの
手法では「同時」と言えるのでしょうか?

notifyやjoinの仕様がよくわかってないので調べろ、と
言われそうですが・・。
Gio
ぬし
会議室デビュー日: 2003/11/28
投稿数: 350
お住まい・勤務地: 都内から横浜の間に少量発生中
投稿日時: 2005-01-27 01:11
蛇足ですが、Windows の時間分解能は 10〜15ms のようです。
今は確認できませんが、Solaris 8 でもこの程度だったと思います。
厳密性を期するならログの時間も信用できませんよ。

マルチプロセッサシステムで、リアルタイム OS 上で green thread ではなく native thread を使えば...
保証はありません(_ _)
VIM
ベテラン
会議室デビュー日: 2003/11/14
投稿数: 76
投稿日時: 2005-01-27 07:40
セマフォみたいなやつかなと考えて調べてみました。

http://bach.istc.kobe-u.ac.jp/java/examples/

真ん中にある【相互に干渉するスレッドの実行】の3番目。

> 複数の子スレッドが並行して動作し, 親スレッドが go を実行するまで待ち,
> go が実行されたら Kobe と表示する. go が先に実行されていれば,待たずに表示する.
> * Ex0203a.java

感覚的にはこれっぽい気がします。
(株)ぽち
ぬし
会議室デビュー日: 2002/09/10
投稿数: 376
投稿日時: 2005-01-27 10:09
ありがとうございます。

参照したプログラムも実行するとやはりログ上の時間は
全く同一にはならないので、これは先にも言われている
通りかなり低いレイヤーでの話しになりそうですね。

知識不足でした。
MMX
ぬし
会議室デビュー日: 2001/10/26
投稿数: 861
投稿日時: 2005-01-27 10:16
ハードウェアのシミュレーションなら専用の言語がありますが。
CPU自身のクロックはPCの時計のような精度です
最近は電磁放射スペクトルの山をつぶすために、クロックにわずかな
時間変動をかける例も多いです。
数学的な同時動作は 実現できません。
==============================================
お互いに通信するよりは、外部同期の考えで
共通時計を見て 指定時刻に実行とかも、スケーラビリティあるかも
台が違うのなら、LANのボードキャストを受信待ちとか。

[ メッセージ編集済み 編集者: MMX 編集日時 2005-01-27 15:21 ]
yamasa
ベテラン
会議室デビュー日: 2003/02/15
投稿数: 80
投稿日時: 2005-01-27 11:08
他の方もおっしゃられているように、複数のスレッドを
本当の意味で「同時に実行する」には
少なくともスレッド数と同じだけのCPUが必要ですが、
複数のスレッドを「同時に実行可能状態にする」だけなら
「バリア同期」という構造が使えます。

http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/java/util/concurrent/CyclicBarrier.html

スキルアップ/キャリアアップ(JOB@IT)