Java:如何停止线程?
有没有办法阻止线程外部的另一个线程? 比如,如果我运行一个线程来运行该线程并导致该线程停止?它能阻止另一条线吗 有没有一种方法可以在没有循环的情况下从内部阻止线程?Java:如何停止线程?,java,multithreading,Java,Multithreading,有没有办法阻止线程外部的另一个线程? 比如,如果我运行一个线程来运行该线程并导致该线程停止?它能阻止另一条线吗 有没有一种方法可以在没有循环的情况下从内部阻止线程? 例如,如果您正在下载理想情况下,您可能希望使用循环,如果我使用循环,我将无法暂停它,直到它到达循环的末尾。建议的方法是将其构建到线程中。因此,不,您不能(或者更确切地说,不应该)从外部终止线程 如果需要停止,则不经常检查螺纹。(不要在有数据之前阻塞套接字。使用超时,并每隔一段时间检查用户是否表示要停止)JavaSun建议使用共享变量
例如,如果您正在下载理想情况下,您可能希望使用循环,如果我使用循环,我将无法暂停它,直到它到达循环的末尾。建议的方法是将其构建到线程中。因此,不,您不能(或者更确切地说,不应该)从外部终止线程
如果需要停止,则不经常检查螺纹。(不要在有数据之前阻塞套接字。使用超时,并每隔一段时间检查用户是否表示要停止)JavaSun建议使用共享变量作为要求后台线程停止的标志。然后,可以通过请求线程终止的不同对象设置此变量
您可以通过这种方式终止另一个进程,然后终止当前进程。您可以创建一个布尔字段,并在运行中检查它:
public class Task implements Runnable {
private volatile boolean isRunning = true;
public void run() {
while (isRunning) {
//do work
}
}
public void kill() {
isRunning = false;
}
}
要阻止它,就打电话
task.kill();
这应该是可行的。我们不停止或终止线程,而是执行
thread.currentThread().isInterrupted()。
大体上,我们将这样做:
Thread t1 = new Thread(new Task1());
t1.start();
t1.interrupt();
public class MyThread extends Thread {
@Override
public void run() {
while (!this.isInterrupted()) {
//
}
}
}
一种可能的方法是这样做:
Thread t1 = new Thread(new Task1());
t1.start();
t1.interrupt();
public class MyThread extends Thread {
@Override
public void run() {
while (!this.isInterrupted()) {
//
}
}
}
当您想停止线程时,只需调用中断()方法:
当然,这不会立即停止线程,但会在上面循环的后续迭代中停止。在下载的情况下,您需要编写一个非阻塞代码。这意味着,您将仅在有限的时间内尝试从套接字读取新数据。如果没有可用的数据,它将继续。可以从类套接字使用此方法完成:
mySocket.setSoTimeout(50);
在本例中,超时设置为50毫秒。在该时间过去且未读取任何数据后,将抛出SocketTimeoutException。通过这种方式,您可以编写迭代的非阻塞线程,使用上面的构造可能会终止这些线程
以任何其他方式杀死线程是不可能的,您必须自己实现这种行为。在过去,线程对此有一些方法(不确定是kill()还是stop()),但现在不推荐使用。我的经验是,JVM的一些实现目前甚至不包含该方法。您真的应该让它变得易变。那么,就没有同步问题了。但是,如何启动
run()
部分呢?像这样:<代码>任务任务=新任务(),线程任务线程=新线程(任务)代码>,任务线程.start()
。killtask.kill()
?while循环中没有任何东西可以阻止工作的进行。kill()方法现在已经被弃用,interrupt()不应该更安全更干净吗@momomo自定义异常可以做到这一点。在我使用过的每个操作系统上,很容易说服套接字上的阻塞读取尽早返回。从另一个线程关闭套接字会导致读取返回错误。在大多数情况下,没有必要编写非阻塞代码-通常有一些方法可以解除阻塞:)这就是我想说的:)编写非阻塞代码的意思,例如,设置套接字超时等。因为如果您在线程内部创建了所有套接字,并且无法从外部访问,那么如果配置不正确,您将无法杀死该线程。太棒了!感谢您注意到非阻塞代码,非常有用。同样,在我使用过的任何操作系统上,都没有必要在套接字读取时使用浪费的超时。从另一个线程关闭套接字会导致read()返回错误。最好使用thread.interrupted()
而不是thread.currentThread().isInterrupted()
调用t1.interrupt()
,java.lang.InterruptedException:sleep interrupted
总是发生。为什么?假设部分代码不是您的(比如JDBC,一个阻止IO的驱动程序,它不检查IO是否被中断),您将如何处理它?