【问题标题】:Why java doesn't support restarting a thread [duplicate]为什么java不支持重新启动线程[重复]
【发布时间】:2012-04-06 10:49:24
【问题描述】:

可能重复:
How to start/stop/restart a thread in Java?

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

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

【问题讨论】:

  • 这不是骗子。其他问题询问“如何重新启动线程”。这个问题问“为什么不能完成”。不过,“为什么设计师选择......”问题往往没有建设性
  • 因为计算机有跳转指令,所以可以执行循环。如果开发人员希望一个线程多次执行某些代码,他们通常选择将其置于循环中,在某个同步对象的顶部等待,然后在需要时发出运行信号——实际上是主体的“重新启动”的代码。 “重新启动”意味着另一个线程状态,“不存在”、“正在运行”和“有点停止但不销毁,以防万一再次需要它”。

标签: java multithreading restart


【解决方案1】:

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

【讨论】:

  • 伙计们,我的查询背后的意图是了解其背后的技术意识形态。是否有任何技术限制,或者更多的是设计选择。
【解决方案2】:

由于 Thread.run() 方法背后的想法。这个想法是每个线程都有生命周期,如果它过期(完成 run() 方法块),线程就会死掉。 如果你想在一段时间内停止线程然后再次运行它,常见的方法是实现 Runnable 接口(或扩展 Thread 类)并在里面得到一个布尔标志。 这是一个简单的代码:

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; }
 }

现在当线程没有被中断时,它将等待重新启动。当您中断它时,它无法再重新启动。

【讨论】:

    猜你喜欢
    • 2011-04-15
    • 2016-04-18
    • 2014-03-04
    • 2016-05-06
    • 2011-02-21
    • 1970-01-01
    • 1970-01-01
    • 2010-10-02
    • 2015-03-22
    相关资源
    最近更新 更多