180416
慕村3124171

这里改成this.interrupt()
;
interrupted和interrupt是两个方法
很多事就是巧合
在sleep过程中调用的中断方法,抛出了中断异常,所以不用sleep
慕后端1690971
中断就是中途停止,开车开到一半,主动停了下来,并不再行驶。
堵塞就是遇红灯,开车遇到红灯停止,红灯过后继续行驶。(sleep设置红灯时间)
qq_邪炎_0
你问的是哪两个结果呢?视频中应该是三个结果 1.intterrupt未中断线程运行 2.interrupt中断了线程运行 3.抛出异常,未中断线程运行
慕盖茨1011508
thread.interrupt()方法的作用是唤醒阻塞的线程,并抛出异常。当sleep后,线程阻塞,thread.interrupt()方法执行后,线程又被唤醒并抛出异常。因为线程被唤醒,所以this.isInterrupted()的值为false,while语句继续
我是猫_夏
在catch中再次调用interrupt()就OK了
慕UI1804229
再调用一次Thread.interrupted();方法 会清除掉之前线程的状态
具体的建议你看一下api
该方法可以清除线程的中断状态 。 换句话说,如果这个方法被连续调用两次,那么第二个调用将返回false(除非当前线程再次中断,在第一个调用已经清除其中断状态之后,在第二个调用之前已经检查过)。
忽略线程中断,因为线程在中断时不存在将被该方法返回false所反映。
结果
true如果当前线程已被中断; false否则。
以上是java api中的表述
福工刘德华
这不就是时间差吗?long time就是当时运行到此时的当时时间,而while循环判断条件里面的是判断运行过程中的当前时间,当前时间和time的差值等于1000是不就跳出来循环了嘛
qq_瑾少_03944252
实际上这个线程不止一个,还有一个线程是负责启动main负责启动每一个线程,而main中的那个Thread.sleep是使main线程休眠,而run方法中的sleep是让实例化的那条线程休眠,而你在main方法中用interrupt停止实例化的那条线程就会导致api里面所谓的报错,我认为你是错将main方法中的停止main线程的Thread.sleep认为是停止实例化的那条线程,导致这种疑问出现
慕瓜2111070
这样
wait一般等什么东西的时候就要跟for
如果是“在..等”就用“at,in”等介词
大的地方时in
小地方at 比如:在校门口等 wait at the school gate
一切都是浮云丶
不是咸鱼
thread调用了interrupt()方法, 并不是如字面意义上就会将线程终止, 而是将线程的终止状态设置为true, 使isInterrupted()方法返回ture, 而这个时候while循环里的判断条件又没有提到isInterrupted()方法, 所以即使thread调用了interrupt()方法, 对这个循环也没有任何影响啊, 所以线程还是会一直执行下去
世界知名伟人
是中断不是终断;
比如讲师在本节课中的一个例子:
package com.imooc.demo;
public class WrongWayStopThread extends Thread {
public static void main(String[] args) {
WrongWayStopThread thread = new WrongWayStopThread();
System.out.println("Starting thread");
thread.start();
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("Tnterrupting thread");
thread.interrupt();
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("Stopping thread");
}
@Override
public void run() {
// 在线程之中,我们定义了一个无限循环的while()结构,在while()循环之中,我输出线程正在运行的信息
// 然后嵌套一个空的while()循环,减少屏幕输出,使得每秒只输出一行信息,它的作用大致相当于Thread.sleep(1000)
// 但是为什么不是Thread.sleep(1000)?
//
while (!this.isInterrupted()) {
System.out.println("Thread is running");
long time = System.currentTimeMillis();
while ((System.currentTimeMillis() - time) < 1000) {
// try {
// Thread.sleep(1000);
// } catch (InterruptedException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
}
}
}
}我们知道main也一个主线程,在执行到程序的入口,也就是main()方法的时候,程序就会产生一个线程,然后调用start()的时候会产生一个线程,这两个线程并行,调用Thread.sleep(3000),指的是让main这个主线程休眠3秒,我们的thread线程才抢占资源运行,随着main线程3秒后的恢复,thread线程就恢复了抢占资源的状态,然后main线程读取到了thread.interrupt(),也就是说thread线程进行了终止,那么isInterrupted()的返回值就是true,所以while()循环会停止,也就是说,thread线程结束了,然后经过Thread.sleep(),主线程就又停止了3秒,然后输出线程停止。
一家之言,敬请指正!
爱与痛的边缘4126319
可以中断线程,但是尽量处理成其他不抛出异常的方案。
zsfen
相当于sleep(1000),也就是休眠一秒的意思。
慕粉1474367326
雪中_悍刀行
当中断没有发生时,this.isInterrupted()值为false,执行while循环体内程序,当中断发生时,this.isInterrupted()值为true,跳出while循环;如视频isInterrupted()是一个线程判断是否发生中断的方法,返回一个boolean值
慕斯8597481
调用sleep()阻塞当前线程,当其他线程调用interrupt()的时候,sleep()会发生InterriptedException()中断异常,并清除中断状态。System.currenttime - time)<1000是if的判断条件,当这个值小于1000时进入if()代码块执行程序。
qq_大人物_0
感觉听视频里讲,不如来看评论,评论描述的还清楚些
码农_鑫森淼焱垚
哈哈,微笑不语
小羊爱主
你可以去API中查下sleep方法的解释,他是Thread的静态方法,而静态方法调用时用类去调用而不是实体对象去调用
小羊爱主
主线程影响其它线程的执行进度,怎么会改变其它线程的interrupt状态,而且我也试了下,主线程的sleep只影响当前线程的interrupt状态,也就是说,线程影响其本身的interrupt状态,如果在main线程中调用Thread.sleep(),Thread是指主线程,影响执行进度;如果在子线程中调用Thread.sleep(),Thread是指当前线程,也就是子线程,等价于Thread.currentThread().sleep();
额,其实只是个人理解,不知道对与不对,这就是我的理解,如果你要问当前线程sleep为什么会影响当前线程interrupt状态,那你就要去看源代码了——————————————。—————————
snake先森
用WE.interrupt()。 Thread.interrupted()错了。
留一阵风
问题还是回到interrupte()方法的初衷,这个方法是用来向线程发出中断请求,而非停止线程的。当然很多时候要停止线程就需要先给他一个中断请求,然后让线程处理中断(比如处理InterruptedException)。
在你提到的shutdownNow中,我们看到调用interruptWorkers()也是这个意思,让所有的worker线程有机会处理中断。紧接着,tryTerminate()回去做停止的工作。
public List<Runnable> shutdownNow() {
List<Runnable> tasks;
final ReentrantLock mainLock = this.mainLock;
mainLock.lock();
try {
checkShutdownAccess();
advanceRunState(STOP);
interruptWorkers();
tasks = drainQueue();
} finally {
mainLock.unlock();
}
tryTerminate();
return tasks;
}
竹韵林梅
本质是你得线程被连接网络的I/O阻塞了。你可以考虑一些非阻塞的方法,看看NIO里有没有相关的类吧。
Lemuria
xiongxiong_CPP
在我睡了一觉之后,突然理解你的问题了。视屏中我们花了大量的时间在讲解API文档的内容,答案也来自于那里。sleep()让线程进入了等待的状态,此时调用interrupt()方法,interrupt状态不会改变,于是后续希望停掉线程的企图就落空了,线程还会精力充沛的干活。
慕设计2762038
殴打小学生