Anzeige:
Ergebnis 1 bis 4 von 4

Thema: Verständnissfrage: Verarbeitung vonProgramminstanzen

  1. #1
    Registrierter Benutzer
    Registriert seit
    31.10.2006
    Beiträge
    5

    Verständnissfrage: Verarbeitung vonProgramminstanzen

    Ich habe mal eine Frage dazu wie Java genau die einzelnen Instanzen ein und des selben Programmes verarbeitet.


    Folgende Situation stellt sich mir:
    Ich habe ein Javaprogramm das eine Datei verschlüsselt. Die Datei wird mit der Prozess ID versehen. Das selbe gilt auch für die Ausgabe. Womit die Datei immer einen eindeutigen Namen hat, da die Prozess ID ja nicht mehrmals vergeben werden kann.

    Dieses Programm kann nun mehrmals Parallel aufgerufen werden. Wenn dies nun passiert, kommt bei der Verschlüsselung nur noch Schrott raus. Es werden praktisch dieVerschlüsselungen der parallel laufenden Instanzen des Programms vermischt.


    Das ganze findet unter Suse Linux statt.
    Die Frage ist nun, wie handelt Java die Instanzen von diesem einen Programm ab? Ich dachte jedenfalls immer, das auch in der Java-VM jeder Aufruf so zu sagen seinen eigenen Prozess bekommt, der Unabhängig von den anderen Arbeitet. Das Verhalten zeigt jedoch leider etwas anderes. Das von diesem einen Programm, egal wieviele Parallel aufegrufen werden, immer nur eine Instanz existiert.

    Oder gibt es möglichkeiten zu bestimmen ob von einer Klasse immer nur eine Instanz des Objektes existieren darf, unabhängig wie oft dieses eine Programm aufgerufen wird.


    Der Aufruf des Programms erfolgt so:
    Code:
    cd /usr/labor/MeinJavaProc
    
    /usr/bin/java -Xmx300m -Dfile.encoding=8859_1 -classpath "Bin/MeinJavaProc.jar:Bin/gnu.jar:Bin/bcprov-jdk14-133.jar:Bin/commons-beanutils.jar:Bin/commons-collections.jar:Bin/commons-digester.jar:Bin/commons-logging.jar:Bin/itext.jar:Bin/jasperreports.jar:Bin/jakarta-poi.jar" MeinJavaProc.Main -mMeinJavaProc -fQuelle/$1
    
    rc=$?
    exit $rc

  2. #2
    Registrierter Benutzer
    Registriert seit
    07.05.2003
    Beiträge
    127
    Es gibt eigentlich kein "Programm", es gibt Klassen und Instanzen (Objekte). Das, was man umgangsprachlich als Programm bezeichnet ist die Sammlung aller Klassen und vor allem die mit der Methode "main".
    Alles, was "static" deklariert ist, wird zur Übersetzungszeit angelegt, sollte also nur einmal existieren (Bei Servlets ist das meines Wissens wieder etwas anders).
    Arbeitest Du mit einem Objekt, das Du angelegt hast (new), oder innerhalb statischer Methoden?

    mamue

  3. #3
    Registrierter Benutzer
    Registriert seit
    31.10.2006
    Beiträge
    5
    Das "Programm" ist leider nicht von mir, darf mich nur damit rumschlagen Darf ich dann aber deiner Ausage entnehmen das wenn ich nur mit statischen Methoden Arbeite es hier zu konflikten kommen kann wenn ich ein solches "Programm", wie oben beschrieben, aufrufe?


    Wie schaut das denn mit dem Stack aus? Ich hoffe doch das Java hier für jeden der obigen Aufrufe einen eigenen anlegt.


    Das Problem dieses speziellen "Programmes" hab ich der weil gefunden. Es legt eine Datei in einem "work" Verzeichnis ab und sammelt dann alle Dateien bei jeder Instanz ein um diese zu verarbeiten...könnte den Programmierer dafür erschlagen

    Gut das ist dieses Spezielle Programm. Mir gehts aber im Moment eher um das allgemeine Verständnis.

  4. #4
    Registrierter Benutzer
    Registriert seit
    07.05.2003
    Beiträge
    127
    Tja, es ist schon eigenartig, was der Autor dort wohl gemacht haben wird.
    1.: Die Prozess-ID bekommt unter Java so einfach nicht, es gibt eine angeblich nicht dokumentierte Methode dazu.
    2.: Statische Bezeichner sind statisch zu ihrer Laufzeitumgebung. D.h. bei jedem Start werden sie neu angelegt.

    So sieht mein Test aus:
    Code:
    import java.lang.management.*;
    
    public class Test {
      static double rand = Math.random();
    
      public static void main( String[] args ) {
        RuntimeMXBean rt = ManagementFactory.getRuntimeMXBean();
        System.out.println( "random Number:" + rand );
        System.out.println( "process ID:" + rt.getName() );
        try {
          Thread.sleep( 10000 );
        }
        catch( InterruptedException ie ) {
          ie.printStackTrace();
        }
      } //main
    } //class Test
    Wenn ich das Programm mehrfach starte, was dank Thread.sleep( 10000 ) funktioniert, bekomme ich verschiedene Werte für "rand" und auch verschiedene Prozess-IDs.
    Alles, was ich zuvor gesagt habe, ist zwar nicht völlig falsch aber zumindest irreführend.

    HTH,
    mamue

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •