Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.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_Runnable - Fatal编程技术网

Java线程之间的交互

Java线程之间的交互,java,multithreading,runnable,Java,Multithreading,Runnable,我有两个实现Runnable的类(A和B) 两个线程都以这种方式执行: A a = new A(); new Thread(a).start(); B b = new B(); new Thread(b).start(); 我需要在线程B中停止/等待/恢复线程A 这是怎么可能的?实际上,你不能只是停止踩踏。正如markspace评论的那样,这是可能的,但在某些特殊情况下,你应该小心地做 为什么Thread.stop不推荐使用 因为它本质上是不安全的。停止线程会使其解锁所有已锁定的监视器。(

我有两个实现Runnable的类(A和B)

两个线程都以这种方式执行:

A a = new A();
new Thread(a).start();

B b = new B();
new Thread(b).start();
我需要在线程B中停止/等待/恢复线程A


这是怎么可能的?

实际上,你不能只是停止踩踏。正如markspace评论的那样,这是可能的,但在某些特殊情况下,你应该小心地做

为什么Thread.stop不推荐使用

因为它本质上是不安全的。停止线程会使其解锁所有已锁定的监视器。(当线程死亡异常向堆栈上传播时,监视器被解锁。)


java中没有暂停/恢复线程的方法。如果您想要这个,您应该自己实现它-例如,在某些条件下等待


您可以看到一个示例,如何使线程等待互斥,然后通知它。无论如何,只有当线程执行一些周期性的操作时,这才有可能。如果线程操作是可靠的,则无法实现您的目标。

如果
A
B
继承自
thread
为什么要将它们传递到
thread
?对我来说,这似乎是对继承的严重滥用,简单地从
线程
继承
扩展Runnable
。此外,如果没有很好的理由,您永远不应该从
线程继承
。简而言之-始终
实现可运行的
和从不
扩展线程
。您能给我们提供更多关于您尝试执行的操作的信息吗?当然可以。你通常不应该这样。在某些情况下,可以使用Thread.stop()。你只需要在做这件事之前仔细考虑一下。所以你建议我在4°段落中引用这句话:“停止的大多数用法应该被简单地修改一些变量以指示目标线程应该停止运行的代码所取代。”。实际上,我已经把我的解决方案变成了这个,但我认为这是一种老式的方法,以便猜测是否有其他方法可以使用一些线程函数来实现这一点。但现在它运行良好。谢谢你,谢尔盖
Thread.suspend()
Thread.resume()
已被弃用,但它们仍然可用。@markspace从技术上讲,我们可以吃钉子,但我不会向任何人建议:)但是suspend()和resume()在某些情况下确实有用。不推荐并不意味着“永远”。你的类比失败了,因为你夸大了太多——调用不推荐的方法和吃钉子完全不同。它可能导致死锁。也许不算太多,但很危险。