温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Java线程终止实例分析

发布时间:2022-04-26 13:40:35 来源:亿速云 阅读:278 作者:iii 栏目:开发技术

这篇文章主要介绍了Java线程终止实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java线程终止实例分析文章都会有所收获,下面我们一起来看看吧。

Java线程终止实例分析

题目解析

答案选C

A:线程使用sleep()方法,使线程挂起一段时间,并不是终止

B: 创建一个新线程时,对之前的线程没有影响

C:抛出一个例外,线程终止

D: 并不是终止,而是抢占,进程是资源分配的最基本单位,同一个进程创建的不同线程共享这些资源,当某一个线程优先级比较高时,它就会抢占其他线程的资源,导致其他线程没有资源可用,会造成阻塞

线程结束的三个原因

1、run方法执行完成,线程正常结束

2、线程抛出一个未捕获的Exception或者Error

3、直接调用该线程的Stop方法结束线程(不建议使用,容易导致死锁)

具体分析

线程结束的三种方法

①使用标志位退出线程

②使用stop方法强制终止线程

③使用interrupt终止线程

1、使用标志位推出线程

一般 run()方法执行完,线程就会正常结束,然而,常常有些线程是伺服线程。它们需要长时间的运行,就要使用一个变量控制循环

定义了一个退出标志 exit,当 exit 为 true 时,while 循环退出,exit 的默认值为 false.在定义 exit 时,使用了一个 Java 关键字 volatile,这个关键字的目的是使 exit 同步,同一时刻只 能由一个线程来修改 exit 的值

public class ThreadSafe extends Thread {
  public volatile boolean exit = false; 
    public void run() { 
     while (!exit){
     //do something
     }
  } 
}

2、使用stop方法强制终止线程

程序中可以直接使用 thread.stop()来强行终止线程,但是 stop 方法是很危险的,就象突然关 闭计算机电源,而不是按正常程序关机一样,可能会产生不可预料的结果,不安全主要是: thread.stop()调用之后,创建子线程的线程就会抛出ThreadDeatherror 的错误,并且会释放子 线程所持有的所有锁。

3、使用interrupt终止线程

当线程处于两种状态时,使用interrpt终止

(1)线程未处于阻塞状态:

使用 isInterrupted()判断线程的中断标志来退出循环,再使用 interrupt()方法时,中断标志就会置 true,和使用自定义的标志来控制循环是一样的

public class MyThread extends Thread {
    @Override
    public void run() {
        try {
            for (int i = 0; i < 500000; i++) {
                if (interrupted()) {
                    System.out.println("已经是停止状态了");
                    throw new InterruptedException();//中断异常
                }
                System.out.println("i=" + (i + 1));
            }
            System.out.println("我在for下面");
        } catch (InterruptedException e) {
            System.out.println("进run方法中的catch了!");
            e.printStackTrace();
        }
 
    }
}

(2)线程处于阻塞状态:如使用了sleep方法,同步锁的 wait,socket 中的 receiver,accept 等方法时,调用线程的 interrupt()方法

public class ThreadInterrupt extends Thread {  
    public void run()  {  
        try {  
            sleep(50000);  // 延迟50秒  
        }  
        catch (InterruptedException e) {  
            System.out.println(e.getMessage());  
        }  
    }  
    public static void main(String[] args) throws Exception  {  
        Thread thread = new ThreadInterrupt();  
        thread.start();  
        System.out.println("在50秒之内按任意键中断线程!");  
        System.in.read();  
        thread.interrupt();  
        thread.join();  
        System.out.println("线程已经退出!");  
    }

关于“Java线程终止实例分析”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“Java线程终止实例分析”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注亿速云行业资讯频道。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI