2012-03-08 10 views
0

私はjarファイルを実行していますが、java -jar xx.jar -file xx.fileを使用して実行しています。今度は、そのjarファイルを同時に56回以上使用する必要があります。タスクマネージャには56個以上のjava.exeがあるはずです。 しかし、私のPCには多くのリソースが必要ですが、1つのJavaプロセスのみを起動し、異なる引数で実行する方法はありますか? 不明な点がある場合は、私の意見を聞くことができますか分からない場合は、私に知らせてください。 jarファイルは私によって書かれておらず、私はバイナリしか持っていません。1つのJavaプロセスでjarファイルを呼び出す方法

ヒント?

もう1つの質問は、56以上のJavaプロセスがある場合、私のPCは非常に非常に遅くなりますか? jvmを低メモリ使用量または低CPU使用量に設定して修正できますか?

おかげで、 ユージン

答えて

0

は、あなたのアプリケーション内のスレッドを使用することができます。そうすれば、あなたは1つのJavaプロセスを持っています。これにより、50-60のスレッドが再び生成されます。これを行うには、おそらくアプリケーションを少し再設計する必要があります。このページを最初に見てみましょう。 http://www.javaworld.com/javaworld/jw-04-1996/jw-04-threads.html

+0

こんにちはグレンは、私はそのソースコードを持っていない...あなたのサードパーティのjarファイルをシミュレートします。そして私のために、私はそれを再設計する自信を持っていない。私はちょうど私達が速い私のPCを助けるために低CPUおよびメモリの使用法にjvmパラメータを設定できるかどうかについて考えています。 – yixuan

+0

sun/oracle VMでは、 "java -Xms12m -Xmx12m -jar file.jar"のような-Xmsオプションを使用して、最小ヒープ・サイズを設定することができます。足跡の少ない多くのプロセスがあります。 –

+0

12 MBがJVMには不十分かもしれません。 – mcfinnigan

0

56 javaプロセスは常にあなたのPCを遅くします。最大メモリ設定には-Xmxを、コマンド行には最小メモリ設定用の-Xmsを使用できます。

備考、私は本当に56個のJavaプロセスを実行すると、私は別の実行ファイルを起動

+0

こんにちはTom、これらのパラメータを説明する1つのドキュメントまたはWebサイトがありますか?私もそれを最初にしたい、スレッドメソッドを実装しようとするが、緊急の要求のために、私はまずプロセスをスムーズに行かせる必要があります。 :)ありがとう、ユージーン – yixuan

+0

これらのサイトを確認することができます(http://avricot.com/blog/index.php?post/2010/05/03/Get-started-with-java-JVM-memory-%28heap%2C -stack%2C-xss-xms-xmx-xmn ...%29)と(http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html)ですが、Googleは開始するには良い場所 – tom

3

これは、別々のプロセスを使用せずに1つのJavaアプリの中から可能です...この例では

良いアイデアだとは思いませんjarファイルを10回実行します。私は、標準のJarFileクラスを使ってメインクラスを照会し、それを新しいスレッドで実行します。また、私は、各インスタンスごとに別のクラスローダーを使用します。これがなければ、シングルトンは別々のアプリケーション間で衝突するので、これは重要です。 (実行可能なjarファイルをfoo.jarを中に含まれる)

public static void main(String[] args) { 

    for (int i = 0; i < 10; i++) { 
     try { 
      File file = new File("foo.jar"); 
      JarFile jar = new JarFile(file); 
      String main = jar.getManifest().getMainAttributes() 
        .getValue(Name.MAIN_CLASS); 

      URLClassLoader freshLoader = new URLClassLoader(
        new URL[] { file.toURI().toURL() }, null); 

      Class<?> classToLoad = Class.forName(main, true, freshLoader); 
      Class<?>[] argTypes = new Class[] { String[].class }; 
      final String[] mainArgs = new String[] { "arg1", "arg2" }; 
      final Method method = classToLoad.getMethod("main", argTypes); 

      Runnable job = new Runnable() { 
       @Override 
       public void run() { 
        try { 
         method.invoke(null, (Object) mainArgs); 
        } catch (Exception e) { 
         e.printStackTrace(); 
        } 
       } 
      }; 
      new Thread(job, "Thread :" + jarFile).start(); 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

テストアプリクラスが

public class Main { 

    private static int counter; 

    public static void main(String[] args) { 
     JFrame frame = new JFrame("Test frame"); 
     frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
     frame.getContentPane().setLayout(new GridLayout(2, 1)); 
     frame.getContentPane().add(new JLabel("instance " + counter)); 
     frame.getContentPane().add(
       new JLabel("launched with " + Arrays.asList(args))); 
     frame.pack(); 
     frame.setVisible(true); 

     counter++; 
    } 

} 
+3

+1良い例@Adam – Rakesh