Java 与线程相比,进程在上下文切换方面是否有任何开销?

Java 与线程相比,进程在上下文切换方面是否有任何开销?,java,multithreading,process,Java,Multithreading,Process,关于我打算做什么的几句话。我需要创建一些任务执行器,它将轮询队列中的任务,并只执行此任务中的代码。为此,我需要实现一些中断机制,使用户能够停止这个任务 因此,我看到了两种可能的解决方案:1。启动线程池并使用线程的.destroy()方法停止它们。(我不会使用任何共享对象)2。使用分离进程池和System.exit()或kill信号进行处理。备选案文2。看起来对我来说更安全,因为我可以确保线程终止不会导致任何并发问题。但我不确定它是否会产生很大的开销 我也不确定JVM,如果我使用分离的进程,每个进

关于我打算做什么的几句话。我需要创建一些任务执行器,它将轮询队列中的任务,并只执行此任务中的代码。为此,我需要实现一些中断机制,使用户能够停止这个任务

因此,我看到了两种可能的解决方案:1。启动线程池并使用线程的
.destroy()
方法停止它们。(我不会使用任何共享对象)2。使用分离进程池和
System.exit()
或kill信号进行处理。备选案文2。看起来对我来说更安全,因为我可以确保线程终止不会导致任何并发问题。但我不确定它是否会产生很大的开销

我也不确定JVM,如果我使用分离的进程,每个进程都将使用分离的JVM,这会带来很多开销。或者不是。所以我的问题是。对于我来说,选择一种不同的语言而不使用worker进程的运行时是可能的选择,但我仍然没有足够的进程经验,也不知道开销

使用线程的.destroy()方法启动线程池并停止它们。(我不会使用任何共享对象)

你不能停止现代虚拟机上的线程,除非说线程“在上面”。破坏和朋友不真正做你想做的,这是不安全的。正确的方法是调用
interrupt()
。如果线程想打扰您,而不是在遇到中断调用时实际停止,那么它们可以。解决方案是修复代码,使其不再这样做。请注意,提升中断标志将保证停止任何正在休眠的方法,该方法被指定为引发InterruptedException(休眠、等待等),并且在大多数操作系统上,也将导致当前冻结的任何I/O调用通过引发IOException退出,但这一点无法保证

  • 使用分离的进程池和System.exit()或kill信号进行处理
  • Hella很贵;虚拟机不是一个轻巧的东西;它将拥有所有类的自己的副本(甚至像
    java.lang.String
    和company这样简单的东西)。10个虚拟机是一个延伸。而1000个线程是没有问题的

    为此,我需要实现一些中断机制,使用户能够停止这个任务

    真正的问题是,这很难保证。但是如果你控制了需要中断的代码,那么通常没什么大不了的。只需使用interrupt()机制

    编辑:如果你想知道如何做中断的事情:在线程上提升中断标志只会提升标志;除非您编写与之交互的代码,或者调用与之交互的方法,否则不会发生任何其他情况

    主要有3种交互作用:

  • 所有阻塞并声明抛出InterruptedEx的东西都将降低标志并抛出InterruptedEx。如果标志已打开,并且您调用了
    Thread.sleep
    ,则会立即清除标志并抛出异常,而无需等待。因此,捕获该异常,并返回/中止/中断任务

  • Thread.interrupted()
    将降低标志并返回true(因此,只执行一次)。将其放入事件循环中。它不是
    public void run(){while(true){…}
    while(running){}
    或诸如此类,而是
    while(!Thread.interrupted()
    或可能
    while(running&!Thread.interrupted9))

  • 任何其他阻塞方法可以是也可以不是;java故意不指定任何一种方式,因为它依赖于操作系统和体系结构。如果他们这样做了(许多人也这样做了),他们就不能抛出interruptedex,例如,
    FileInputStream.read
    不被指定抛出它。它们抛出IOException,并显示一条消息,指示发生了中止

  • 确保这三条代码路径以某种方式导致任务迅速结束,并且您拥有您想要的:用户可中断任务

    使用线程的.destroy()方法启动线程池并停止它们。(我不会使用任何共享对象)

    你不能停止现代虚拟机上的线程,除非说线程“在上面”。破坏和朋友不真正做你想做的,这是不安全的。正确的方法是调用
    interrupt()
    。如果线程想打扰您,而不是在遇到中断调用时实际停止,那么它们可以。解决方案是修复代码,使其不再这样做。请注意,提升中断标志将保证停止任何正在休眠的方法,该方法被指定为引发InterruptedException(休眠、等待等),并且在大多数操作系统上,也将导致当前冻结的任何I/O调用通过引发IOException退出,但这一点无法保证

  • 使用分离的进程池和System.exit()或kill信号进行处理
  • Hella很贵;虚拟机不是一个轻巧的东西;它将拥有所有类的自己的副本(甚至像
    java.lang.String
    和company这样简单的东西)。10个虚拟机是一个延伸。而1000个线程是没有问题的

    为此,我需要实现一些中断机制,使用户能够停止这个任务

    真正的问题是,这很难保证。但是如果你控制了需要中断的代码,那么通常没什么大不了的。只需使用interrupt()机制

    编辑:如果你想知道如何做中断的事情:在线程上提升中断标志只会提升标志;除非您编写与之交互的代码,或者调用与之交互的方法,否则不会发生任何其他情况

    主要有3种交互作用:

  • 所有阻塞并声明抛出InterruptedEx的东西都将降低标志并抛出InterruptedEx。如果标志已打开,并且您调用了
    Thread.sleep
    ,则会立即清除标志并抛出异常,而无需等待。因此,捕获该异常,并返回/中止/中断任务

  • Thread.interrupted()