- - PR -
マルチスレッドプログラミングに関して
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2005-03-22 17:32
マルチスレッドプログラミングに関して質問があります。
あるプログラムをjarファイル化してそのプログラムをWebから実行しています jarファイル化したプログラムのmainをsynchronizedとすれば複数端末から同時に実行されても 一方は処理が終わるまで待つと思っていたのですが同時に実行されてしまいます。 同時に実行されても一方は待つようにするにはどのようにすればいいのでしょうか? javaに関してはそれほど知識が無いのでご存知の方がいらっしゃればご教授願います。 以下に簡略したソースを記述します ●jarファイル化したプログラム(Hoge1.jar) public final class Hoge1 extends Hoge2 { public static synchronized int main() { try { //ここで実際のロジックを実行 Hoge2.doGyoumu(); //エラーが無ければ0を戻す return(0); } catch (HogeException ex) { //エラーがあれば1を戻す return(1); } } } ●jarファイルを呼び出して実行するWebプログラム import Hoge.Hoge1; int ret = Hoge1.main(); |
|
投稿日時: 2005-03-22 17:41
Webから実行、というのはどのような手段をもって行っているのでしょうか?
cgi で実行しているのでしたらそれぞれ別のプロセスとして実行されてしまいます。マルチスレッド、ではなくマルチプロセスで動くことになりますので synchronized 修飾子をつけても同期されません。 サーブレットなどを使って同一の JVM(一つのjavaプロセス内)で同時に実行するのであれば synchronized されたメソッドは同期されます。ただし、この場合同期はインスタンス毎に行われますので毎回 Hoge1 クラスのインスタンスを生成していたのでは複数同時に実行されることになります。 |
|
投稿日時: 2005-03-22 18:11
どういう条件で実行しているかにもよりますが、
実行方法を変えれないのであれば、 ロックを示すファイルを作成するとか、 物理的なブロックの為のオブジェクトを用意するのが無難かもしれません。 またstaticメソッドに対する同期化は、プロセスの違いの他に クラスローダがそれぞれ別であっても同期化されません。 |
|
投稿日時: 2005-03-23 10:09
インギさん、ご指示ありがとうございます
Webからの実行はサーブレットで実行しています。 開発環境としてはTomcat+Strutsを利用しており Web画面のあるボタンが押されれば下記Actionが実行されるようになっております import Hoge.Hoge1; public final class TestAction { public ActionForward execute( ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws HogeException { try { int ret = Hoge1.mai return (mapping.findForward("SUCCESS")); } catch (HogeException ex) { return (mapping.findForward("ERROR"); } } } >サーブレットなどを使って同一の JVM(一つのjavaプロセス内)で同時に実行するのであれば >synchronized されたメソッドは同期されます。 >ただし、この場合同期はインスタンス毎に行われますので毎回 Hoge1 クラスのインスタンス >を生成していたのでは複数同時に実行されることになります。 すみませんがここの意味がよく判りません... 上記Action内でjarファイルのプログラムをimportして実行しているだけなのですが毎回Hoge1クラスのインスタンスを生成していることになるのでしょうか? |
|
投稿日時: 2005-03-23 10:10
かつのりさん、ご指示ありがとうございます
>どういう条件で実行しているかにもよりますが、 >実行方法を変えれないのであれば、 >ロックを示すファイルを作成するとか、 >物理的なブロックの為のオブジェクトを用意するのが無難かもしれません。 そうですね、そういう方法もありますね。 >またstaticメソッドに対する同期化は、プロセスの違いの他に >クラスローダがそれぞれ別であっても同期化されません。 これはjarファイルのプログラムのmainメソッドがstaticなので 同期化ができないと言うことでしょうか? |
|
投稿日時: 2005-03-23 10:39
jarはどこに配置していますかね?
Hoge1.main()とやる前に System.out.println(Hoge1.class.getClassLoader()); ってやってみて下さい。(複数端末から同時に実行) |
|
投稿日時: 2005-03-23 11:09
かつのりさん、ご指摘のコードを実行してみました。
長いのですが、そのまま貼り付けます、2台の端末で実行しましたが内容は同じでした WebappClassLoader available: Extension[javax.mail, implementationVendor=Sun Microsystems, Inc., implementationVendorId=com.sun, implementationVersion=1.3.1, specificationVendor=Sun Microsystems, Inc., specificationVersion=1.3] Extension[org.apache.commons.beanutils, implementationVendor=Apache Software Foundation, implementationVersion=1.6, specificationVendor=Apache Software Foundation, specificationVersion=1.6] Extension[org.apache.commons.collections, implementationVendor=Apache Software Foundation, implementationVersion=2.1, specificationVendor=Apache Software Foundation, specificationVersion=2.1] Extension[org.apache.commons.digester, implementationVendor="Apache Software Foundation", implementationVersion="1.5", specificationVendor="Apache Software Foundation", specificationVersion="1.5"] Extension[commons-fileupload, implementationVendor=Apache Software Foundation, implementationVendorId=, implementationVersion=1.0, specificationVendor=Apache Software Foundation, specificationVersion=] Extension[commons-lang, implementationVendor=Apache Software Foundation, implementationVersion=1.0.1, specificationVendor=Apache Software Foundation, specificationVersion=1.0] Extension[org.apache.commons.logging, implementationVendor=Apache Software Foundation, implementationVersion=1.0.3, specificationVendor=Apache Software Foundation, specificationVersion=1.0] Extension[org.apache.commons.validator, implementationVendor=Apache Software Foundation, implementationVersion=1.0.2, specificationVendor=Apache Software Foundation, specificationVersion=1.0] Extension[org.apache.struts.Struts Legacy Distribution, implementationVendor=Apache Software Foundation, implementationVersion=1.0, specificationVendor=Apache Software Foundation, specificationVersion=1.0] Extension[Struts Framework, implementationVendor=Apache Software Foundation, implementationVendorId=org.apache, implementationVersion=1.1, specificationVendor=Apache Software Foundation, specificationVersion=1.1] delegate: false repositories: /WEB-INF/classes/ required: ----------> Parent Classloader: StandardClassLoader available: delegate: true repositories: file:C:\Program Files\Apache Group\Tomcat 4.1\shared\classes\ required: ----------> Parent Classloader: StandardClassLoader available: Extension[commons-pool, implementationVendor=Apache Software Foundation, implementationVendorId=, implementationVersion=1.1, specificationVendor=Apache Software Foundation, specificationVersion=] Extension[org.apache.commons.collections, implementationVendor=Apache Software Foundation, implementationVersion=2.1, specificationVendor=Apache Software Foundation, specificationVersion=2.1] Extension[org.apache.commons.logging, implementationVendor=Apache Software Foundation, implementationVersion=1.0.3, specificationVendor=Apache Software Foundation, specificationVersion=1.0] Extension[org.apache.tools.ant, implementationVendor=Apache Software Foundation, implementationVersion=1.6.0, specificationVendor=Apache Software Foundation, specificationVersion=1.6.0] Extension[javax.mail, implementationVendor=Sun Microsystems, Inc., implementationVendorId=com.sun, implementationVersion=1.2, specificationVendor=Sun Microsystems, Inc., specificationVersion=1.2] Extension[commons-dbcp, implementationVendor=Apache Software Foundation, implementationVendorId=, implementationVersion=1.1, specificationVendor=Apache Software Foundation, specificationVersion=] Extension[org.apache.commons.dbcp, implementationVendor=Apache Software Foundation, implementationVersion=1.0, specificationVendor=Apache Software Foundation, specificationVersion=1.0] Extension[org.apache.commons.pool, implementationVendor=Apache Software Foundation, implementationVersion=1.0.1, specificationVendor=Apache Software Foundation, specificationVersion=1.0] delegate: true repositories: file:C:\Program Files\Apache Group\Tomcat 4.1\common\classes\ file:C:\Program Files\Apache Group\Tomcat 4.1\common\endorsed\xmlParserAPIs.jar file:C:\Program Files\Apache Group\Tomcat 4.1\common\endorsed\xercesImpl.jar file:C:\Program Files\Apache Group\Tomcat 4.1\common\lib\activation.jar file:C:\Program Files\Apache Group\Tomcat 4.1\common\lib\jasper-runtime.jar file:C:\Program Files\Apache Group\Tomcat 4.1\common\lib\jasper-compiler.jar file:C:\Program Files\Apache Group\Tomcat 4.1\common\lib\naming-resources.jar file:C:\Program Files\Apache Group\Tomcat 4.1\common\lib\commons-pool-1.1.jar file:C:\Program Files\Apache Group\Tomcat 4.1\common\lib\commons-collections.jar file:C:\Program Files\Apache Group\Tomcat 4.1\common\lib\naming-common.jar file:C:\Program Files\Apache Group\Tomcat 4.1\common\lib\commons-logging-api.jar file:C:\Program Files\Apache Group\Tomcat 4.1\common\lib\ant.jar file:C:\Program Files\Apache Group\Tomcat 4.1\common\lib\mail.jar file:C:\Program Files\Apache Group\Tomcat 4.1\common\lib\servlet.jar file:C:\Program Files\Apache Group\Tomcat 4.1\common\lib\jdbc2_0-stdext.jar file:C:\Program Files\Apache Group\Tomcat 4.1\common\lib\jndi.jar file:C:\Program Files\Apache Group\Tomcat 4.1\common\lib\naming-factory.jar file:C:\Program Files\Apache Group\Tomcat 4.1\common\lib\jta.jar file:C:\Program Files\Apache Group\Tomcat 4.1\common\lib\commons-dbcp-1.1.jar file:C:\Program Files\Apache Group\Tomcat 4.1\common\lib\tools.jar file:C:\Program Files\Apache Group\Tomcat 4.1\common\lib\axis.jar file:C:\Program Files\Apache Group\Tomcat 4.1\common\lib\commons-dbcp.jar file:C:\Program Files\Apache Group\Tomcat 4.1\common\lib\commons-pool.jar file:C:\Program Files\Apache Group\Tomcat 4.1\common\lib\log4j-1.2.8.jar file:C:\Program Files\Apache Group\Tomcat 4.1\common\lib\ojdbc14.jar1 required: ----------> Parent Classloader: sun.misc.Launcher$AppClassLoader@67ac19 |
|
投稿日時: 2005-03-23 14:04
問題ないように見えますね。
「同時に実行されてしまう」のはどのようにして確認していますか? |