Java中的线程隔离

Java中的线程隔离,java,multithreading,process,isolation,Java,Multithreading,Process,Isolation,在Java中,有没有可靠的方法确保线程彼此隔离?我已经有一个半星期的问题了,由于静态变量和其他我无法控制的事情,实现各种第三方源代码的线程不断发生冲突 我知道单个系统可以运行我正在处理的项目的任意多个实例。但是,当试图将所有内容合并到一个线程化的单个可执行文件中时,总会出现错误和异常 我几乎要为我想要的这个程序的每个实例启动一个新的进程,但我真的不想走这条路(这会消除我收集的大量实时数据,也会妨碍我杀死目标进程的能力) 建议?谢谢 如果您要使用的库的作者没有将其代码设计为线程安全的,那么除了防止

在Java中,有没有可靠的方法确保线程彼此隔离?我已经有一个半星期的问题了,由于静态变量和其他我无法控制的事情,实现各种第三方源代码的线程不断发生冲突

我知道单个系统可以运行我正在处理的项目的任意多个实例。但是,当试图将所有内容合并到一个线程化的单个可执行文件中时,总会出现错误和异常

我几乎要为我想要的这个程序的每个实例启动一个新的进程,但我真的不想走这条路(这会消除我收集的大量实时数据,也会妨碍我杀死目标进程的能力)


建议?谢谢

如果您要使用的库的作者没有将其代码设计为线程安全的,那么除了防止两个线程同时调用它之外,您几乎无法轻松做到

您可以使用类加载器使用一些技巧,但这往往会导致一个全新的复杂世界。更详细地说,如果使用不同的类加载器,那么可以将同一个类加载两次(或更多次)到同一个JVM中,因此可以有效地获得静态变量的独立副本。一些JavaEE应用服务器利用了单独类加载器的这种使用。这反过来又导致了这样一个问题:当库本身开始进行一些反射和动态类加载时,会使用哪个类加载器和类路径。除非您的需求很大,否则我不推荐这种方法

根据偏好,将是:

1) 。为不安全代码指定一个单线程工作线程。试着在你的多线程应用程序中做尽可能多的工作,尽可能少地投入到工作人员中

2) 。如果工作进程是处理过程的主要部分,因此您确实需要并行执行,请将工作进程拉到多个单独的进程中,使用一些IPC通信来共享工作进程。这感觉像是一个JMS排队解决方案可以很好地工作


3) 。如果您负担不起开销,请尝试寻找线程安全的库替代方案,或者如果您对作者有影响,请让他们修复代码。要提高它们的并行性真的不难。

不幸的是,没有办法做到这一点。如果线程访问共享资源,它们应该根据需要锁定这些资源,否则您的程序肯定会面临共享状态的损坏

也许您可以将对共享资源的访问包装为允许您同步访问的方式

我快到了公正的地步了 为每个客户启动新流程 我想要的这个程序的实例, 但我真的不想再下去了 路线(它将消除许多 我收集的实时数据,以及 阻碍我杀死目标的能力 过程。)

听上去,您试图重用的代码实际上不是设计用于多线程应用程序的。在这种情况下,为每个实例启动单独的流程实际上可能是您的最佳选择。与其阻碍你杀死每一个实例的能力,它实际上应该使这更容易做到;请参阅
Process.destroy()

虽然不清楚“实时”是什么意思,但如果每个子进程都写入其标准输出,则可以编写控制程序,以便在写入时读取和整理输出

由于静态变量和其他我无法控制的事情,实现各种第三方源代码的线程不断发生冲突

如果真的是这样的话,那么我认为你必须走上有独立流程的道路。如果您调用的代码不是线程安全的,那么您所能做的就是确保此代码一次只由一个进程调用。这基本上消除了在不同线程中运行它的优势

也会妨碍我杀死目标进程的能力

我不明白你的意思。只有使用进程才能安全地终止处理,如果不能完全控制运行的所有代码,就不可能使用线程安全地终止处理


有关类似问题的讨论,请参见。

您可以为每个线程使用单独的类加载器,以加载要分开的第三方库。

您可以尝试将资源放在单个执行器中,这样您就永远不会有两个进程并行运行

您可以通过遗嘱执行人来执行:

class Foo {
  private ExecutorService executor = Executors.newSingleThreadExecutor();

  public void addTask(Runnable bar) {
    executor.submit(bar);
  }
}

您的要求包含在2006年批准的中

我并没有听说太多关于JSR-121的实现,但快速搜索让我找到了