Java 线程停止、暂停和继续

Thread 类中停止线程的方法有 stop(),暂停和继续线程的方法有 suspend() 和 resume()。然而这些方法已经被废弃了。

异常法停止线程

上代码:

public class Test {
    public static void main(String[] args) {
            MyThread thread = new MyThread();
            thread.start();
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            thread.interrupt();
    }
}

class MyThread extends Thread {
    @Override
    public void run(){
        boolean flag = true;
        while (flag) {
            if (this.isInterrupted()) {
                System.out.println("线程即将停止");
                try {
                    throw new InterruptedException();
                } catch (InterruptedException e) {
                    flag = false;
                }

            }
        }
        System.out.println("已经跳出循环,线程停止");
    }
}

打印输出:

线程即将停止
已经跳出循环,线程停止

run 方法执行完,线程自然就结束了。

使用 return 停止线程

public class Test2 {
    public static void main(String[] args) {
        MyThread2 thread = new MyThread2();
        thread.start();
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        thread.interrupt();
    }
}

class MyThread2 extends Thread {
    @Override
    public void run() {
        while (true) {
            if (this.isInterrupted()) {
                System.out.println("线程停止");
                return;
            }
        }
    }
}

打印输出:

线程停止

线程暂停和继续

线程暂停、继续和停止,上代码:

public class Test {
    public static void main(String[] args) {
        MyThread thread = new MyThread();
        thread.start();
        try {
            Thread.sleep(1);
            thread.mySuspend();
            Thread.sleep(1);
            thread.myResume();
            Thread.sleep(1);
            thread.myStop();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

class MyThread extends Thread {
    private int counts = 0;
    private int status = 1;
    private final int SUSPEND = -1;
    private final int RUNNING = 1;

    @Override
    public void run() {
        boolean flag = true;
        while (flag) {
            if (this.isInterrupted()) {
                System.out.println(++counts + " - 线程即将停止");
                try {
                    throw new InterruptedException();
                } catch (InterruptedException e) {
                    flag = false;
                }
            } else if (status == SUSPEND) {
                System.out.println(++counts + " - 线程暂停");
            } else if (status == RUNNING) {

                System.out.println(++counts + " - 线程仍在继续");
            }
        }
        System.out.println(++counts + " - 已经跳出循环,线程停止");
    }

    public void mySuspend() {
        status = SUSPEND;
    }

    synchronized public void myResume() {
        status = RUNNING;
        this.notifyAll();
    }

    public void myStop() {
        this.interrupt();
    }
}

打印输出:

1 - 线程仍在继续
2 - 线程暂停
3 - 线程暂停
...
42 - 线程暂停
43 - 线程暂停
44 - 线程仍在继续
45 - 线程仍在继续
46 - 线程仍在继续
...
87 - 线程仍在继续
88 - 线程仍在继续
89 - 线程仍在继续
90 - 线程仍在继续
91 - 线程即将停止
92 - 已经跳出循环,线程停止
时间: 2024-10-14 14:06:28

Java 线程停止、暂停和继续的相关文章

java 线程停止的方法

线程停止的方法: 记住一点,线程的停止, 1.自己运行完了, 2.如果是无限循环,在外部,只能用flag标记来操作. 但是当线程处于冻结状态(阻塞),sleep,wait,join,(这三个方法抛出异常.) 就不会读取到flag. 这个时候,我们要清除线程的冻结状态,让它回到运行中. 如果,线程没有使之冻结的语句,则,inierrupt()不进行任何操作. interrupt()方法,会使sleep,wait,jion方法抛出异常. 然后,我们在处理异常的语句中来操作. 我推荐的方式:不在cat

[转]JAVA线程停止的方法

有三种方法可以使终止线程. 1.  使用退出标志,使线程正常退出,也就是当run方法完成后线程终止. 2.  使用stop方法强行终止线程(这个方法不推荐使用,因为stop和suspend.resume一样,也可能发生不可预料的结果). 已废弃 3.  使用interrupt方法中断线程. 如何停止java的线程一直是一个困恼我们开发多线程程序的一个问题.这个问题最终在Java5的java.util.concurrent中得到了回答:使用interrupt(),让线程在run方法中停止. 简介

java线程停止的方法

之前介绍过,停机线程可以使用interrupte ,可以用标记,让run执行结束.现在我们来看几个方法. 方法1.使用interrupte方法来执行,通过抛出InterruptedException来结束run运行. package secondThreadStudy; import java.lang.InterruptedException; public class MyThread extends Thread { @Override public void run(){ super.r

Java线程状态、线程停止、线程阻塞

线程状态(五种状态) Java 线程的生命周期包括创建,就绪,运行,阻塞,死亡5 个状态.一个 Java 线程总是处于这 5 个生命周期状态之一,并在一定条件下可以在不同状态之间进行转换 . 创建状态 (New Thread) 在 Java 语言中使用 new操作符创建一个线程后,该线程仅仅是一个空对象,它具备了线程的一些特征,但此时系统没有为其分配资源,这时的线程处于创建状态. 就绪状态 (Runnable) 使用 start()方法启动一个线程后,系统为该线程分配了除 CPU 外的所需资源,

Java中停止线程执行的方法

Java中停止线程执行的方法 作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chszs 一.暂停或停止线程的理论 在Java编程中,要暂停或停止当前正在运行的线程,有几种方法.对于把线程转入睡眠Sleep状态,使用Thread.sleep()是最正确的方式.或许有人会问,为什么不使用等待wait()或通知notify()?要知道,使用等待或通知都不是很好的方式. 线程可以使用等待wait()实现被阻塞,这属于条件等待的方式,当条件满足后,又会从阻塞转为等待状态

如何停止一个正在运行的java线程

与此问题相关的内容主要涉及三部分:已废弃的Thread.stop().迷惑的thread.interrupt系列.最佳实践Shared Variable. 已废弃的Thread.stop() @Deprecated public final void stop() { stop(new ThreadDeath()); } 如上是Hotspot JDK 7中的java.lang.Thread.stop()的代码,学习一下它的doc: 该方法天生是不安全的.使用thread.stop()停止一个线程

浅析Java线程的正确停止

线程错误终止之destroy与stop方法 记得以前初学Java的时候,由于缺少对锁.同步.异步等这些线程的知识,想当然的以为destroy与stop方法都能正确的停止Java线程的执行.但是,后来随着工作的积累,以及对线程安全的一些理解,慢慢认识到这两个方法是有问题的,并且这两方法也早已在java doc上被指名是弃用的. destroy()这个方法其实根本没干什么事情,只是抛出了一个NoSuchMethodError,所以说该方法无法终止线程,因此不能望文生意: /** * Throws {

如何停止JAVA线程

如何停止JAVA线程 如何停止java的线程一直是一个困恼我们开发多线程程序的一个问题.这个问题最终在Java5的java.util.concurrent中得到了回答:使用interrupt(),让线程在run方法中停止. 简介 在Java的多线程编程中,java.lang.Thread类型包含了一些列的方法start(), stop(), stop(Throwable) and suspend(), destroy() and resume().通过这些方法,我们可以对线程进行方便的操作,但是

Java线程池停止空闲线程是否有规则呢?

Java线程池中线程的数量超过核心线程的数量,且所有线程空闲,空闲时间超过keepAliveTime,会停止超过核心线程数量的线程,那么会保留哪些线程呢?是不是有规则呢? 测试代码: ThreadPoolExecutor executor = new ThreadPoolExecutor(3, 5, 3, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(5)); int taskNum = 13; for (int i = 0; i <