Frage : Java synchronisierte Gewindeausgabe

Hallo haben experts

We eine Ausgabe mit synchronisierten Methoden und synchronisierte Gegenstände mit threads

We haben richtig zu haben und Testcode, dem wir Einfaßungsanträge abfeuern, in die dann ein Gewinde herstellt, was in einen synchronisierten Verschluss einsteigt, der irgendeinen blinden Test process.

We erwarten mit dem synchronisierten Prozess durchführt, der Code durchläuft, 1 Gewinde des Gewindes 4 des Gewindes 3 des Gewindes 2 zu sein, aber wir haben z.Z. Ausgabe, wohin die Gewinde die synchronisierte Methode in dieser Gewinde 2 thread.
(der Grund des Gewindes 3 des Gewindes 4 des Auftrages 1 das 1 Gewindeprozeßerste, da es das erste Gewinde ist, zum des synchronisierten Verschlusses zu schlagen)

The Java Version durchlaufen, die, wir verwenden sein:
java Version „1.5.0_16 "
Java (TM) Plattform, Standardausgabe für Geschäft (Bau 1.5.0_16-b02)
Java Bediener VM des Krisenherd-(TM) (der Bau 1.5.0_16-b02, gemischt)

We haben einiges getan, das herum gräbt und die dort Art einer Wanze auf Java side
http://bugzilla.globus.org /globus/show_bug.cgi fanden? id=5583

But sind wir nicht imstande, die Java-Version JVM zu aktualisieren, da andere Anwendungen dieses version.

So für die Frage verwenden:

1. Gibt es andere der Weise der Anwendung einer verriegelnmethode mit der aktuellen Version von Java, was mit den mehrfachen Gewinden arbeitet, die auf sie zurückgreifen, was Gewinde in Auftrag gehen lässt?

2. Wir benötigen Verschlüsse einer Reihe, also können wir bestimmte Gewinde steuern, welche die Methoden tun, um data.
zum Beispiel Thread-1 zu verarbeiten, zurückgreifen auf eine Methode erhalten ein Verschluss [0]
Thread-2 zurückgreifen auf eine Methode erhalten ein Verschluss [1]
Thread-3 zurückgreifen auf eine Methode erhalten einen Verschluss [0] (blockiert zu Thread-1 wird beendet, während es die gleichen procces die selben wie Thread-1 benötigt), in-bringen
Etc…

Thanks,

p.s. sind Testcode ist unten mit der Ausgabe mit dem Gewinde bestellen(jeder möglicher Einfaßungsantrag lässt den Code auf dem korrekten Hafen) laufen,
voran
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
6:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
import java.net. *;
Import java.io.*;
Import java.io.*;
Import java.util.*;
Import java.text.*;

allgemeiner Kategorie Test verlängert die jagdbaren Gewindewerkzeuge {
  allgemeiner Test () {
  }


//as erhält ein reponce verursachen ein Gewinde strate, das anfangen weg ist dann, wieder listioning

  // =========================================================================
  ServerSocket svrSocket;
  int clientCount;
  Einfaßung clientSocket;
  allgemeines Boolesches ExitCommand = falsch;
  int IMIStatsFlag = 1;
  int PortNumber = 20009;
  int QueSize = 1000;
  statischer Gegenstand [] mutex = neuer Gegenstand [100];
  statischer Gegenstand mutex1;


  allgemeine Staticlückenhauptleitung (Schnur arg []) {
   System.out.println („Anfang“);
mutex [0] = 0;


   Prüfen T1 = neuer Test ();
   T1.start1 ();
    System.out.println („strossenweise gegewonnen“);
 }


  Öffentlichkeit leere start1 ()
  {
      int iclientCount = 120;       //-Zahl der Gewinde begonnen

mutex1 = 1;

      Versuch {
          svrSocket = neues ServerSocket (PortNumber, QueSize);
      } Fang (Ausnahme/* IOException * e) {
		  System.out.println (e.toString ());
              Rückkehr;
          }
          während (IMIStatsFlag == 1)
          {

          Versuch {
              während (zutreffend) {

                  clientSocket = svrSocket.accept ();
            BufferedReader in = neues BufferedReader (neues InputStreamReader (clientSocket.getInputStream ()));
			Schnur XMLString = in.readLine ();
			in.close ();
            clientSocket.close ();


            Test prüfen = neuer Test ();
			test.start ();



              }
          } Fang (IOException e) {
                  //-Störung
                  System.out.println („MIStatsListener, Anfang, IO-Störung: „+ e.toString ());
          }
      }

  }



    Öffentlichkeitslücke laufen gelassen () {
			System.out.println (Thread.currentThread () + „vor Verschluss“);
		LockTest (0);
	}



  Öffentlichkeit leeres LockTest (int MutexLockNumber) {


		Versuch {
			Thread.sleep (10);

		} Fang (Ausnahme ex) {
		}
	System.out.println (Thread.currentThread () + „vor Verschluss“);
	System.out.println (Thread.currentThread () + „Gewindezählimpuls“ + Thread.activeCount ());

	synchronisiert (mutex [MutexLockNumber]) {
	//synchronized (mutex1) {

	System.out.println (Thread.currentThread () + „Innere-Verschluss“);
	int x =0;

	während (x! = 10) {


		System.out.println (Thread.currentThread () + " „+x);
		x++;
		Versuch {
			Thread.sleep (1000);

		} Fang (Ausnahme ex) {
		}
	}
	System.out.println (Thread.currentThread () + „Verschluss Finnshing“);
}
	System.out.println (Thread.currentThread () + „Verschluss, der jetzt“ verlässt);


    }



}

Antwort : Java synchronisierte Gewindeausgabe

Klingt wie Sie sollte eine Warteschlange (und möglicherweise auch ein Semaphor) anstatt benutzen

http://www.exampledepot.com/egs/java.lang/WorkQueue.html
http://java.sun.com/developer/technicalArticles/J2SE/concurrency/

Weitere Lösungen  
 
programming4us programming4us