• 技术文章 >Java >java教程

    Java线程终止的几种方式及实例分析

    WBOYWBOY2023-04-27 10:31:07转载50

    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线程终止的几种方式及实例分析的详细内容,更多请关注php中文网其它相关文章!

    声明:本文转载于:亿速云,如有侵犯,请联系admin@php.cn删除
    专题推荐:Java
    上一篇:Java中的do-while语句用法及示例 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • java中UDP怎么发送数据• Java连接SqlServer错误如何解决• Java方法如何定义与调用• Java操作pdf的工具类itext怎么处理• java的SynchronousQueue是什么
    1/1

    PHP中文网