StructuredTaskScope, ScopedValue und Daemon -FädenJava

Java-Forum
Anonymous
 StructuredTaskScope, ScopedValue und Daemon -Fäden

Post by Anonymous »

Auf der Suche nach einer Lösung für das Problem von Java -Daemon -Threads, die Zugriff auf ScopedValues ​​ erfordern, da sie zum Zeitpunkt des Erstellens des Daemon -Threads gebunden waren. Damit untergeordnete Threads ScopedValues ​​ erben können, muss das strukturierte TaskScope Fork/Join -Protokoll verwendet werden. Dieses Protokoll funktioniert jedoch nicht für Daemon -Threads, da es unmöglich ist, einen Bereich für sie zu erstellen, das niemals endet. Selbst wenn der gesamte Hauptfaden in einem solchen Bereich eingeschlossen ist, kann der Daemon -Thread nach main () endet und in main () erstellt () wird per Definition beendet. Die Daemon -Threads können Bibliothekscode aufrufen, die diese Dienste verwenden, und dies kann während des Herunterfahrens von JVM nach dem Ende main () geschehen. Der Satz von Diensten kann sich im Laufe der Zeit ändern (z. B. Wartung, neue Funktionen usw.), daher sollte die Lösung angesichts einer sich ändernden Liste von Diensten robust sein. Meine Lösung (unten) fühlt sich wie ein Hack an und ist für ein oder zwei Werte in Ordnung, aber es erfordert mehrere Codeänderungen, wenn ein weiterer ScopedValue im Daemon -Thread benötigt wird, und ist anfällig für Auslassungsfehler, wenn ein Code, den viele Ebenen im Dämon -Thread tief im Dämon -Thread nennt, einen Scoped -Wert verwendet. Z.B. Es ist nicht offensichtlich, auf welche ScopedValues ​​ möglicherweise durch den Daemon -Thread verwiesen wird, daher die Präferenz für eine automatische Erbschaft, wie sie durch StructuretaSkScope . Es erstellt den Daemon -Thread und verlässt sofort den ScopedValue.run () block. Zu diesem Zeitpunkt hat der Foreverthread die Werte bereits erfasst, die es benötigt, um seinen eigenen Bereich zu erstellen. Der große Nachteil dazu ist, alle Werte ausdrücklich aufzulisten, die möglicherweise vom Daemon -Thread benötigt werden (und alle Code, die er aufruft).

Code: Select all

static ScopedValue sv1 = ScopedValue.newInstance();
static ScopedValue sv2 = ScopedValue.newInstance();

public static void main(String args[]) {

ScopedValue.where(sv1,  "My value 1").where(sv2, "My value 2").run(() -> {
System.out.println("In main thread, sv1.isBound()="+sv1.isBound());
System.out.println("In main thread, sv2.isBound()="+sv2.isBound());

new ForeverThread(sv1.get(), sv2.get()).start();
});

try {Thread.sleep(1000);} catch (InterruptedException never) {}
System.out.println("Done");

}

public static class ForeverThread extends Thread {
String v1, v2;
public ForeverThread(String v1, String v2) {
this.setDaemon(true);
this.v1 = v1;
this.v2 = v2;
}
@Override
public void run() {
ScopedValue.where(sv1,  v1).where(sv2,  v2).run(() -> {
System.out.println("In child thread, sv1.isBound()="+sv1.isBound());
System.out.println("In child thread, sv2.isBound()="+sv2.isBound());
});
}
}
< /code>
Ausgabe, wie erwartet: < /p>
In main thread, sv1.isBound()=true
In main thread, sv2.isBound()=true
In child thread, sv1.isBound()=true
In child thread, sv2.isBound()=true
Done

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post