【问题标题】:Stop thread using return statement使用 return 语句停止线程
【发布时间】:2012-04-18 11:14:56
【问题描述】:

停止一个线程,如:

new Thread ( new Runnable() { 

 public void run(){ 
    if ( condition ) return; // this will stop the thread. 

} 
}).start(); 

是否正确/安全?

【问题讨论】:

  • 是的...它是正确且安全的。你自己没试过吗?
  • 是的,我试过了,它有效,但我不确定这是否是最好的解决方案......
  • 是安全的,但是这段代码没有任何意义。 run() 方法将返回句点。如果你在你的线程中引用一个布尔值并且依赖于它(就像循环直到它被满足的情况),条件应该是同步的。所以虽然这个例子总是会安全返回,但使用条件不一定是安全的。
  • @sethro - 如果 condition 是从另一个线程设置的变量,则声明它可能就足够了。但是,在 OP 的问题中没有迹象表明 condition 正在从另一个线程更改。
  • @sethro,就我而言,只是这个线程可以改变condition(在if语句之前),所以我认为不需要同步......

标签: android multithreading return


【解决方案1】:

当然。 Thread 将完成并可以加入。如果你抛出 RuntimeException 或者只是让代码在 run() 方法的末尾运行,线程也会退出。

【讨论】:

    【解决方案2】:

    run() 方法返回时线程停止。在run() 中使用什么逻辑来决定何时或如何返回并不重要。您的代码完全正确且安全。

    【讨论】:

    • run() 中使用什么逻辑来决定何时返回当然很重要。例如,如果 run() 内部的逻辑是,while(!condition){ // do something } return;即使条件设置为 true(在不同的线程上),run() 方法也可能永远不会返回,除非条件上有一些同步。
    • @sethro - 这不会改变当run() 方法返回时线程停止的事实。当然可以编写无限循环或与您描述的线程间同步问题发生冲突,但这只是意味着run() 方法可能永远不会返回(因此线程永远不会停止)。但是,我的答案确实需要修改:当run() 方法退出 时,即使它通过抛出异常而不是返回而退出,线程也会停止。
    • 我真的不是要学究气,但是问这个问题的方式意味着 OP 正试图明确停止 Thread,这与让 Thread 完成它的不同任务和结束。如果这就是 OP 想要做的,那么为什么会出现这种情况?也许我只是读错了。我真的很想提供帮助,因为我已经多次看到这种异步线程终止。
    • @sethro - 你关于同步的观点很好,我并没有试图忽视它。我只是想澄清一下正在讨论的两个不同的事情:当run() 方法返回或异常结束时线程退出的规则(据我了解,这是对 OP 问题的直接回答)以及正确共享数据的规则线程之间。
    【解决方案3】:

    是的,它是正确且安全的……

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-07
      • 1970-01-01
      • 2021-09-10
      • 2022-06-15
      相关资源
      最近更新 更多