thread.interrupt()方法
这个方法会对指定的thread线程执行一个打断操作
为了方便讨论,我们把线程的状态分为“两类”,分别是阻塞状态和非阻塞状态。
当线程处于阻塞状态时
(可以用Thread.sleep(),obj.wait()等方法使得线程处于阻塞状态),如果对于处于阻塞状态的线程执行thread.interrupt()方法,会报一个中断异常。并且会把线程的打断标记清空,恢复为false。
当线程处于非阻塞状态时
调用thread.interrupt()方法,并不会终止正在运行中的线程,仅仅是设置了一个打断标记为true。如果希望停止,可以不断检测打断标记的变化,进行相应的逻辑。
thread.isInterrupted()
特别提醒一下,这个isInterrupted()方法是一个成员方法,这个方法是返回打断标记是true还是false。
Thread.interrupted()
特别提醒一下,这个interrupted()方法是一个静态方法,是一个类方法,这个方法也会返回线程的打断标记,但是这个方法会同时清空打断标记
public static boolean interrupted() {
return currentThread().isInterrupted(true);
}
public boolean isInterrupted() {
return isInterrupted(false);
}
四种不同的访问修饰符
四种不同的访问修饰符包括public、默认、private、protected
public
这个访问修饰符是范围最大的,任何位置都可以用被public修饰的一切
private
这个访问修饰符的范围是最小的,仅仅只有本类中可以使用用private修饰的属性
默认
这个访问修饰符的范围仅仅局限于,当前类和当前包中。出了这个范围,被这个修饰符修饰的属性就不能再使用了
package AQS02;
public class ModifyTest {
public int age;
String name;
public int money;
}
package AQS03;
import AQS02.ModifyTest;
public class T {
public static void main(String[] args) {
ModifyTest modifyTest = new ModifyTest();
modifyTest.name
}
}
在上面的代码中name属性被默认修饰符修饰,此时就不能在AQS03这个包中访问这个属性了
protected
这个protected修饰的访问修饰符,其实就是在默认访问修饰符做了一个折中,如果这个类被子类继承的话,那么在子类中就可以访问这个属性了。因此,可以通过子类打破默认修饰符不可以跨包访问的限制。相当于说,如果一个方法被protected修饰了,那么这个方法只能在外包继承这个类的子类被访问了。