Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么java没有';不支持重新启动线程_Java_Multithreading_Restart - Fatal编程技术网

为什么java没有';不支持重新启动线程

为什么java没有';不支持重新启动线程,java,multithreading,restart,Java,Multithreading,Restart,可能重复: 1.如果在正在运行的线程上调用start(),这是一个错误 2.如果对停止的线程调用start(),则不会发生任何事情 不支持对同一对象重新启动的原因是什么?因为Thread.run()方法背后的思想。其思想是,每个线程都有生命周期,如果生命周期过期(完成run()方法块),线程就会死亡。 若您想在一段时间内停止线程,然后再次运行它,常见的方法是实现可运行接口(或扩展线程类),并在其中获得一个布尔标志。 下面是一个简单的代码: public class MyThread imple

可能重复:

1.如果在正在运行的线程上调用start(),这是一个错误 2.如果对停止的线程调用start(),则不会发生任何事情


不支持对同一对象重新启动的原因是什么?

因为Thread.run()方法背后的思想。其思想是,每个线程都有生命周期,如果生命周期过期(完成run()方法块),线程就会死亡。 若您想在一段时间内停止线程,然后再次运行它,常见的方法是实现可运行接口(或扩展线程类),并在其中获得一个布尔标志。 下面是一个简单的代码:

public class MyThread implements Runnable {
    private Thread t;
    private boolean isRestarted;
    private boolean isInterrupted;

    public MyThread() {
           t = new Thread(this);
           isInterrupted = false;
           isRestarted = false;
           t.start();
    }

    public void run() {
       //Do somework
       while(true) {
         if(isInterrupted) break;
         if(isRestarted) run();
       }
    }

    public void restart() { isRestarted = true; }
    public void interupt() { isInterrupted = true; }
 }

现在,当线程未被中断时,它将等待重新启动。当您中断它时,它就不能再重新启动了。

因为Thread.run()方法背后的思想。其思想是,每个线程都有生命周期,如果生命周期过期(完成run()方法块),线程就会死亡。 若您想在一段时间内停止线程,然后再次运行它,常见的方法是实现可运行接口(或扩展线程类),并在其中获得一个布尔标志。 下面是一个简单的代码:

public class MyThread implements Runnable {
    private Thread t;
    private boolean isRestarted;
    private boolean isInterrupted;

    public MyThread() {
           t = new Thread(this);
           isInterrupted = false;
           isRestarted = false;
           t.start();
    }

    public void run() {
       //Do somework
       while(true) {
         if(isInterrupted) break;
         if(isRestarted) run();
       }
    }

    public void restart() { isRestarted = true; }
    public void interupt() { isInterrupted = true; }
 }

现在,当线程未被中断时,它将等待重新启动。当您中断它时,它就不能再重新启动了。

我认为设计人员这样做是因为操作系统级线程通常会以这种方式运行——它们被创建、运行,然后被销毁,操作系统执行清理。因此,Java设计人员可能希望Java中的线程概念接近大多数操作系统中的线程。方法
start()
stop()
并不意味着暂停线程(我们对此进行了同步),只是让它运行并销毁对象。也许名字有点混乱。请注意,
stop()
已被弃用,不应使用,因此如果我们取消
stop()
,名称
start()
就不再那么令人困惑了。

我认为设计者这样做是因为操作系统级线程通常以这种方式运行-它们被创建,它们可能运行,然后它们被销毁,操作系统执行清理。因此,Java设计人员可能希望Java中的线程概念接近大多数操作系统中的线程。方法
start()
stop()
并不意味着暂停线程(我们对此进行了同步),只是让它运行并销毁对象。也许名字有点混乱。请注意,
stop()
已被弃用,不应使用,因此如果我们消除
stop()
,名称
start()
就不再那么令人困惑了。

在这里回答:这不是重复。其他问题问“如何重新启动线程”。这个问题问“为什么不能这样做”。虽然,“为什么设计师选择了……”的问题往往不是建设性的,因为计算机有跳转指令,所以可以执行循环。如果开发人员希望某个线程多次执行某些代码,他们通常会选择将其放入循环中,在某个同步对象的顶部等待,然后在需要时发出运行信号——实际上是代码主体的“重启”。“重新启动”意味着另一个线程状态,“不存在”、“正在运行”和“某种程度上已停止,但不要销毁,以防再次需要它”。回答如下:这不是重复。其他问题问“如何重新启动线程”。这个问题问“为什么不能这样做”。虽然,“为什么设计师选择了……”的问题往往不是建设性的,因为计算机有跳转指令,所以可以执行循环。如果开发人员希望某个线程多次执行某些代码,他们通常会选择将其放入循环中,在某个同步对象的顶部等待,然后在需要时发出运行信号——实际上是代码主体的“重启”。“重新启动”意味着另一种线程状态,“不存在”、“正在运行”和“某种程度上已停止,但不要销毁,以防再次需要它”。各位,我的查询背后的目的是理解它背后的技术思想。有没有技术上的限制,或者更多的是设计上的选择。伙计们,我的问题背后的目的是理解它背后的技术思想。是否存在任何技术限制或更多的是设计选择。