System.setOut() jest threadlocal czy globalny ?

0

Nie trafiam na wyraźną specyfikację

System.setOut() jest lokalny do wątku, czy globalny ?

1
ZrobieDobrze napisał(a):

Nie trafiam na wyraźną specyfikację

System.setLocal() jest lokalny do wątku, czy globalny ?

Czy masz na myśli System.setLocale()?
Skoro jest w System nie zaś w Threads ...

7

ChatGPT rzecze:

System.setOut() jest metodą statyczną klasy System i służy do ustawienia globalnego strumienia wyjścia. Oznacza to, że zmiany wprowadzone za pomocą tej metody będą widoczne we wszystkich wątkach w danej aplikacji.

Sam nie sprawdzałem. Nie chce mi się. A poza tym przecież maszyna nie może się mylić.

2

Metoda System.setOut() jest globalna, a nie lokalna do wątku. Oznacza to, że jeśli zostanie wywołana w jakimś wątku, zmieni ona wyjście standardowe dla wszystkich wątków w aplikacji, a nie tylko dla wątku, w którym została wywołana.

Na przykład, jeśli w aplikacji jest uruchomionych kilka wątków i w jednym z nich wywołasz metodę System.setOut(), aby zmienić wyjście standardowe na plik o nazwie "output.txt", to wszystkie wątki będą korzystać z tego samego pliku "output.txt" jako wyjścia standardowego, niezależnie od tego, w którym wątku została wywołana metoda System.setOut().

Aby ustawić wyjście standardowe tylko dla jednego wątku, należy użyć lokalnych zmiennych wątku (ang. thread-local variables) i odpowiednio przekazywać je do każdej metody w wątku. Na przykład, aby ustawić wyjście standardowe dla jednego wątku i zapewnić, że wyjście innych wątków pozostanie niezmienione, możesz użyć następującego kodu:

// Tworzymy zmienną lokalną wątku, która będzie przechowywać obiekt PrintStream
ThreadLocal<PrintStream> threadOutput = new ThreadLocal<PrintStream>();

// Tworzymy nowy wątek i ustawiamy nowy obiekt PrintStream jako jego wyjście
Thread thread = new Thread(new Runnable() {
  public void run() {
    // Utworzenie nowego obiektu PrintStream
    PrintStream output = new PrintStream(new FileOutputStream("threadOutput.txt"));
    // Ustawienie obiektu PrintStream jako wyjścia dla tego wątku
    threadOutput.set(output);
    // Ustawienie wyjścia dla metod wywoływanych w tym wątku
    System.setOut(threadOutput.get());
    System.out.println("To jest wyjście wątku");
  }
});

// Uruchamiamy wątek
thread.start();

// Poniższy tekst zostanie wypisany na domyślnym wyjściu programu
// (np. konsoli), ponieważ nie zmieniliśmy wyjścia dla głównego wątku programu
System.out.println("To jest wyjście głównego wątku");

Jak widzisz, metoda System.setOut() jest globalna, ponieważ zmienia wyjście dla całego programu. Jeśli chcesz ustawić wyjście tylko dla jednego wątku, musisz użyć lokalnych zmiennych wątku i odpowiednio przekazywać je do każdej metody w wątku. W ten sposób możesz zmienić wyjście tylko dla jednego wątku i zapewnić, że wyjście innych wątków pozostanie niezmienione.

1 użytkowników online, w tym zalogowanych: 0, gości: 1