当前位置: 首页 > 面试题库 >

在多线程Java程序中,每个线程是否都有其自己的System.out副本?

蒙化
2023-03-14
问题内容

我正在编写一个多线程Java程序,其中每个线程可能都需要将其标准输出重定向到一个单独的文件。每个线程都有其自己的文件。是否可以在“每个线程”的基础上重定向System.out或在所有线程上全局更改System.out?


问题答案:

是否可以基于“每线程”重定向System.out

不,这是不可能的。
System.out是静态的,并且在JVM最初启动时,每个JVM都会作为系统类加载器的一部分进行加载。尽管当然建议对每个线程使用适当的日志记录调用,但是我认为有一些原因您无法执行此操作。System.out以这种方式使用的可能是第三方库或其他代码。

您可以做的一件事(作为一个激进的建议)是使您自己的PrintStream委派给ThreadLocal<PrintStream>。但是您将需要@Override应用程序调用的适当方法,以使其按线程工作。

最后,如果你问这个是因为你担心的并发,System.outPrintStream所以它已经是synchronized在幕后,并可以被多个线程安全地使用。



 类似资料:
  • 我正在编写一个多线程Java程序,其中每个线程可能需要将其标准输出重定向到一个单独的文件。每个线程都有自己的文件。是否有可能在“每个线程”的基础上重定向System.out,还是所有线程对System.out全局更改?

  • 我试图理解这句话的含义: 每个Java虚拟机线程都有自己的pc(程序计数器)寄存器。在任何时候,每个Java虚拟机线程都在执行单个方法的代码,即该线程的当前方法(§2.6)。 https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-2.html#jvms-2.5.1 我假设JVM线程像任何其他线程一样工作——每次调度线程运行(比如Linux内

  • 我在试着理解这句话的意思: 每个Java虚拟机线程都有自己的pc(程序计数器)寄存器。在任何一点上,每个Java虚拟机线程都在执行单个方法的代码,即该线程的当前方法(§2.6)。 https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-2.html#jvms-2.5.1 我假设JVM线程的工作方式与任何其他线程一样--每次调度线程运行时(比方

  • 我有多个带有注释的组件,我看到Spring一次只启动一个组件,即使它们被安排在同一时间运行。

  • 我正在尝试设置一个Java程序,其中每个线程都可以使用自己的代理。 现在我只找到了一种全局设置代理的方法。(http://docs.oracle.com/javase/6/docs/technotes/guides/net/proxies.html) 如前所述,这些设置会影响使用这些选项调用的VM的整个生命周期内的所有http连接。然而,使用该系统是可能的。setProperty()方法,使其具有

  • 我有一个类,它基本上会做两次相同的步骤。听起来像是一个在哪里多线程处理程序的完美例子。我的问题是,如果我只需要两个线程就可以做到这一点。以下是一般情况 我已经完成了第一部分——构建对象——的工作。我现在的问题是- 如何让主线程等待两个线程完成其第一部分?也许main会在两个对象上执行等待,然后在线程notifyAll之后,它们会在主线程上执行等待?但是线程如何抓住主线程呢?也许用这个 我怎样才能在