2010-11-18 10 views
0

Ich versuche, Job Checkpointing für Grid-Computing in Java zu simulieren. Ich habe zwei Klassen Job und CheckPointInterrupter, die Threads sind. Die CheckPointInterrupter-Klasse übernimmt in regelmäßigen Abständen Checkpoints eines Jobs.Simulieren Job Checkpointing Java

Um die Simulation einfach zu halten, nehme ich nur die Werte der Variablen von Job als Checkpoint-Status. Ich stehe vor einem Dilemma in Bezug auf das Design der Job-Klasse. Da die Methoden suspend() und resume() jetzt veraltet sind, möchte ich nicht, dass der CheckPointInterrupter sie für den Job verwendet. Also suchte ich nach Alternativen und fand http://www.java2s.com/Code/Java/Threads/Anotherwaytosuspendandresume.htm

Wenn das der Weg zu gehen ist, dann würde ich Checkpointing verwandten Code in die Job-Klasse einführen müssen. Wäre das nicht gegen den Grundsatz einer allein verantwortlichen Klasse? Könnte mir jemand die Art von Jobs in einem Grid/verteilten Umfeld aufklären? Würden diese Jobs "checkpointfähig" werden? Jede Beratung/Hinweis auf Ressource/Google-Suchbegriff würde sehr geschätzt werden. Vielen Dank.

Antwort

0

Ohne zu wissen, welche Art von "Grid-Computing" Sie implementieren, ist Ihre einzige Chance, die "Worker" -Methode zu haben, um sich ihrer Unterbrechbarkeit bewusst zu sein. Im Grunde funktioniert das Interrupt im Allgemeinen in Java.

Wie Sie richtig gesehen haben, sind stop(), suspend(), resume() veraltet, da sie Deadlock verursachen können. T er einzige Methode, um einen Thread jetzt zu unterbrechen, ist Thread.interrupt() verwenden und lassen Sie die "Worker" -Methode die Unterbrechung behandeln, indem Sie regelmäßig Thread.interrupted() abfragen.

Eine Alternative könnte sein, ein anderes Protokoll zu implementieren, um den Worker-Thread darüber zu informieren, pausiert/wieder aufgenommen zu werden/was auch immer, aber der entscheidende Punkt ist, dass die Worker-Methode sich dessen bewusst sein muss.

Sie haben Recht, dass dies das Einpersonen-Prinzip verletzt, aber in der Praxis können Sie fast alle diese Logik in Klassen extrahieren, die speziell dafür entworfen sind (zB eine Art "SuspensionHandler", "WorkContext" usw.)

Dies ist jedoch ein sehr komplexer Bereich und es gibt viele Bücher da draußen, die einen guten Rat geben. (Ich mag Java Concurrency in der Praxis sehr viel, und wenn ich mich richtig erinnere, gibt es ein ähnliches Beispiel darin).