网站首页 > 技术教程 正文
Thread.stop()
当我们使用Thread.stop()方法去停止线程时,这个方法会报错,抛出了UnsupportedOperationException异常,
它在JDK中已经被声明“过期/作废”的方法,显然它在功能上有缺陷,不建议使用。
interrupt()方法
interrupt()方法的简单理解 interrupt() 方法只是改变中断状态而已,
它不会中断一个正在运行的线程。
这一方法实际完成的是,给受阻塞的线程发出一个中断信号,这样受阻线程就得以退出阻塞的状态。
更确切地说,如果线程被 Object.wait, Thread.join 和 Thread.sleep三种方法之一阻塞,
此时调用该线程的interrupt()方法, 那么该线程将抛出一个 InterruptedException中断异常(该线程必须事先预备好处理此异常), 从而提早地终结被阻塞的状态。
看到这里,可能有人会说 Object.wait, Thread.join 和 Thread.sleep 是什么东西?这里介绍下,仔细看下:
线程中常用的方法 sleep、wait、join
sleep:阻塞当前线程,并不释放锁对象 (当前线程让出cpu资源,不会影响锁,能够在程序的任何地方使用)
wait: 阻塞当前线程,释放锁对象 给其他竞争同一个锁的线程
调用wait方法会使该线程进入等待状态,并且会释放被同步对象的锁
wait、notify以及notifyAll都是Object对象的方法,他们必须在被 synchronized 同步的方法或代码块中调用,否则会报错。
notify操作可以唤醒一个因执行wait而处于阻塞状态的线程,使其进入就绪状态,被唤醒的线程会去尝试着获取对象锁,然后执行wait之后的代码。
如果发出notify操作时,没有线程处于阻塞状态,那么该命令会忽略。
注意执行notify并不会马上释放对象锁,会等到执行完该同步方法或同步代码块后才释放。
notifyAll方法可以唤醒等待队列中等待同一共享资源的“全部”线程从等待状态--->就绪状态,进行锁争夺,类似第3天后面逻辑。
public class WaitDmo {
private Student s = new Student();
class T1 extends Thread{
@Override
public void run() {
synchronized (s){
try {
System.out.println("Hello T2");
if (s.getName() == null){
s.wait();
}
System.out.println(s);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
class T2 extends Thread{
@Override
public void run() {
synchronized (s){
try {
System.out.println("Hello T1");
s.setName("lily");
s.notify();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
@Test
public void test() throws InterruptedException {
Thread t1 = new T1();
Thread t2 = new T2();
t1.start();
t2.start();
}
}
当线程一阻塞后,线程二就执行了,
值得注意的是
线程一最后又打印了student对象(name=lily),
是因为线程二唤醒了线程一,
wait和notify搭配使用实现了线程的通信,
对于wait阻塞,也可以直译理解为等待更为贴切。
join: 等待当前线程到死 (可以实现 让多个线程排队执行)
public class MyTread implements Runnable {
private static volatile int num = 0;
private String name;
public MyTread(String name) {
this.name = name;
}
@Override
public void run() {
num++;
System.out.println(name+"num:"+num);
}
}
@Test
public void test() throws InterruptedException {
for (int i = 0; i < 10; i++) {
Thread t = new Thread(new MyTread("Thread-"+i));
t.start();
}
}
//这个执行打印的数据肯定不是顺序的
//可以看到线程并没有顺序执行
如果我们换成下面这样,就会有线程顺序执行了:
@Test
public void test() throws InterruptedException {
for (int i = 0; i <10; i++) {
Thread t = new Thread(new MyTread("Thread-"+i));
t.start();
//就是这里,等待当前线程到死
t.join();
}
}
猜你喜欢
- 2024-10-30 Thread生命周期及interrupted()作用分析
- 2024-10-30 java中interrupt,interrupted和isInterrupted的区别
- 2024-10-30 说一下interrupt()、interrupted()和isInterrupted()的区别
- 2024-10-30 Java面试-interrupt(java面试题八股文面试)
- 2024-10-30 「浅谈Java」2,interrupt,interrupted和isInterrupted的区别
- 2024-10-30 线程的正确终止:interrupt(线程中断的几种 方式)
你 发表评论:
欢迎- 最近发表
-
- linux CentOS检查见后门程序的shell
- 网络安全工程师演示:黑客是如何使用Nmap网络扫描工具的?
- Linux中ftp服务修改默认21端口等(linux修改ftp配置文件)
- Linux系统下使用Iptables配置端口转发,运维实战收藏!
- 谈谈TCP和UDP源端口的确定(tcp和udp的端口号相同吗)
- Linux 系统 通过端口号找到对应的服务及相应安装位置
- 快速查找NAS未占用端口!Docker端口秒级排查+可视化占坑双杀技
- 【知识杂谈#2】如何查看Linux的(本地与公网)IP地址与SSH端口号
- 如何在Linux中查询 DNS 记录,这三个命令可谓是最常用、最经典的
- 【Linux系统编程】特殊进程之守护进程
- 标签列表
-
- 下划线是什么 (87)
- 精美网站 (58)
- qq登录界面 (90)
- nginx 命令 (82)
- nginx .http (73)
- nginx lua (70)
- nginx 重定向 (68)
- Nginx超时 (65)
- nginx 监控 (57)
- odbc (59)
- rar密码破解工具 (62)
- annotation (71)
- 红黑树 (57)
- 智力题 (62)
- php空间申请 (61)
- 按键精灵 注册码 (69)
- 软件测试报告 (59)
- ntcreatefile (64)
- 闪动文字 (56)
- guid (66)
- abap (63)
- mpeg 2 (65)
- column (63)
- dreamweaver教程 (57)
- excel行列转换 (56)
本文暂时没有评论,来添加一个吧(●'◡'●)