精华内容
下载资源
问答
  • 线程停止

    2021-03-28 19:58:57
    文章目录线程停止注意点:具体实现步骤及代码: 线程停止 注意点: 1.建议线程正常停止,利用次数,不建议死循环 2.建议使用一个标志位来判断是否停止 3.不要使用jdk提供的stop和destroy方法,因为已废弃 具体实现步骤及...

    线程停止

    注意点:

    1.建议线程正常停止,利用次数,不建议死循环
    2.建议使用一个标志位来判断是否停止
    3.不要使用jdk提供的stop和destroy方法,因为已废弃

    具体实现步骤及代码:

    package com.heima.Multithreading;
    
    //测试stop
    //1.建议线程正常停止,利用次数,不建议死循环
    //2.建议使用一个标志位来判断是否停止
    //3.不要使用jdk提供的stop和destroy方法,因为已废弃
    public class Stop implements Runnable{
    
        //创建一个标志位来判断是否停止
        private boolean flag = true;
    
        @Override
        public void run() {
            int i = 0;
            while(flag){
                System.out.println("线程运行"+i++);
            }
        }
        //设置一个公开的方法来停止线程,实质是转换标志位
        public void stop(){
            this.flag = false;
            System.out.println("线程停止");
        }
    
        public static void main(String[] args) {
            Stop stop = new Stop();
            new Thread(stop).start();
    
            for (int i = 0; i < 1000; i++) {
                System.out.println("main"+i);
                if (i==900){
                    stop.stop();
                }
            }
        }
    }
    
    

    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述
    这里我们不难看出 , 线程 stop 在运行 , 而main函数里的for循环也在运行 ( 独立,不影响 ) , 只是我们设置了在 mian 里的 for 运行到 900 时 stop 停止运行.

    展开全文
  • 复杂点的Java应用一般都会开多个线程在后台跑程序,有时候因为发布或其他原因需要停止程序,那就涉及到如何停止Java线程的问题.Java 的线程停止还是比较别扭的,如果是从其他语言转学java,很容易掉进坑里面.一 坑一 ...

    复杂点的Java应用一般都会开多个线程在后台跑程序,有时候因为发布或其他原因需要停止程序,那就涉及到如何停止Java线程的问题.Java 的线程停止还是比较别扭的,如果是从其他语言转学java,很容易掉进坑里面.

    一 坑一 利用线程的stop方法

    如果初学Java,在看到Thread类有个stop方法,那第一反应停止应该用stop吧。在好些的IDE里面会给你提示,此方法已经被标记为:@Deprecated,为什么那。那是因为stop是直接停止线程,为什么直接停止程序不行那,因程序可能还没有处理完内存中积压的数据,直接强制停止,就可能会造成数据的完整性被破坏,和我们尽量不要用kill -9 pid来这种暴力停止程序的原因一样。

    那就继续找:suspendresume 看到这两个方法,将线程暂停的时候,也许会用到此方法。结果这个也是坑,这两个方法同样被标记为:@Deprecated,为什么这种暂停的方法也不建议用那,这是因为java的线程在调用suspend暂停后,并没有释放所持有的锁,这样如果其他线程刚好必须用到这把锁,迟迟获取不到,就可能进入到死锁状态。

    二 坑二利用volatile 标记位

    这个是从其他语言转Java的人常用的一种停止线程的方法,这种方法我以前经常用,觉得简单方便,第一次看到用这种方法停止线程是错误的,真令我惊讶。当然不是所有的情况下,都会有问题,在特定的情况下会线程会无法终止。

    实例代码如下: 生产者代码:

    class Producer implements Runnable {
        public volatile boolean canceled = false;
        BlockingQueue storage;
        public Producer(BlockingQueue storage) {
            this.storage = storage;
        }
    
        @Override
        public void run() {
            int num = 0;
            try {
                while (num <= 100000 && !canceled) {
                    if (num % 30 == 0) {
                        storage.put(num);
                        System.out.println(num + "放入队列中。");
                    }
                    num++;
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                System.out.println("生产者结束运行");
            }
        }
    }
    

    消费者代码:

    import java.util.concurrent.BlockingQueue;
    
    class Consumer {
        BlockingQueue storage;
        public Consumer(BlockingQueue storage) {
            this.storage = storage;
        }
        public boolean needMoreNums() {
            if (Math.random() > 0.89) {
                return false;
            }
            return true;
        }
    }
    

    main函数代码:

    import java.util.concurrent.ArrayBlockingQueue;
    
    public class TestStopThread
    {
        public static void main(String[] args) throws InterruptedException {
            ArrayBlockingQueue storage = new ArrayBlockingQueue(8);
    
            Producer producer = new Producer(storage);
            Thread producerThread = new Thread(producer);
            producerThread.start();
            Thread.sleep(800);
    
            Consumer consumer = new Consumer(storage);
            while (consumer.needMoreNums()) {
                System.out.println(consumer.storage.take() + "被消费了");
                Thread.sleep(100);
            }
            System.out.println("消费者停止。");
    
            // 停止标识设置为true 停止生产者
            producer.canceled = true;
            System.out.println(producer.canceled);
        }
    }
    

    代码比较简单,生产者和消费者通过ArrayBlockingQueue 队列相连,生产者生产30倍数的数字,消费者消费,消费者每消费一个数字就会取个随机数看下是否大于0.89,大于则消费者停止消费。 主线程设置生产者停止标识,标识生产者可以停止了,停止后,整个程序也应该停止了。 运行结果:

    38a02ab03e47d26ffe36db6b45a3b564.png

    从结果可以看出,虽然生产者的停止标识为true了,但是整个程序仍然没有停止。 这是因为在生产者的循环中,storage.put(num); 队列满了之后,发生了阻塞,生产者的线程就阻塞在这里面,虽然canceled标识已经设置为true了,但是程序还没有到判断循环标志着一步,所以一直是卡着的。

    三线程停止的正确方式

    Java的线程停止的正确姿势,是采用中断方式,把生产者的核心代码改动如下:

     @Override
        public void run() {
            int num = 0;
            try {
                while (num <= 100000 && !   Thread.currentThread().isInterrupted()) {
                    if (num % 30 == 0) {
                        storage.put(num);
                        System.out.println(num + "倍数放入队列中。");
                    }
                    num++;
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
                System.out.println("线程检测到中断信号");
            } finally {
                System.out.println("生产者结束运行");
            }
        }
    

    主函数改成通过中断方式来通知生产者线程停止:

            producerThread.interrupt();
    

    运行结果:

    8fa7d01f1b310d042bdca628db488f7b.png

    可以看到中断可以打断线程的阻塞,让线程继续执行下去,而且如果线程处于sleep状态,中断仍然可以打断sleep状态,这样就不用像刚才的线程标识那样,还必须等待线程休眠完毕后才可以响应。 中断发生后,我们还可以继续处理剩下的数据,这样就不像stop()方法那样处理的太生硬,而导致数据不一致问题。

    isInterrupted() 会检测中断标识,检测到返回true,并将标志设置成false。所以我们在编写多线程的处理任务代码的时候,不要将中断吞并而不处理,特别有些人喜欢用catch(Execption e)方式来捕获异常,而不处理。如果框架采用这种中断方式来停止线程,那就无法停止线程。

    实话实说,我觉得java这种停线程的方式很容易让人误用,没办法,就这样设计的。

    四 诗词欣赏

    浣溪沙·山色横侵蘸晕霞
    
    [宋代] [苏轼] 
    
    山色横侵蘸晕霞,湘川风静吐寒花。远林屋散尚啼鸦。
    梦到故园多少路,酒醒南望隔天涯。月明千里照平沙。
    展开全文
  • 线程状态,线程停止

    2020-11-02 09:06:44
    线程状态,线程停止 创建状态 Thread t=new Thread(); 开启线程 用t.start方法 就绪状态,就是等待CPU资源调度 阻塞状态,就是调用sleep,wait方法或者同步锁定时,线程进入阻塞状态阻塞事件解除后,就重新进入就绪...

    线程状态,线程停止

    1. 创建状态 Thread t=new Thread();
    2. 开启线程 用t.start方法
    3. 就绪状态,就是等待CPU资源调度
    4. 阻塞状态,就是调用sleep,wait方法或者同步锁定时,线程进入阻塞状态阻塞事件解除后,就重新进入就绪状态
    5. 运行状态,就是CPU在调度中
    6. 最后dead ,线程中断或者结束

    isAilve 方法,就是测试线程是否处于活动状态

    join(),等待该线程终止

    停止线程

    • 不推荐使用JDK提供的stop(),destroy()方法

    自定义线程停止的过程

    package com.Jinone.www;
    
    public class TextStop implements Runnable {
    	//1.设置一个标识位
    	private boolean flag=true;
    	@Override
    	public void run() {
    		// TODO Auto-generated method stub
    		int i=0;
    		while(flag) {
    			System.out.println("run.......Thread");
    		}
    	}
    	//2.设置一个公开的方法停止线程,转换标志位
    	public void stop() {
    		this.flag=false;
    	}
    	public static void main(String[] args) {
    		TextStop stop=new TextStop();
    		new Thread(stop).start();
    		for(int i=0;i<1000;i++) {
    			System.out.println("main "+i);
    			if(i==900) {
    				//调用stop方法切换标志位,让线程停止
    				stop.stop();
    				System.out.println("线程该停止了!");
    			}
    		}
    	}
    
    }
    
    
    展开全文
  • JAVA 线程停止

    2021-03-06 21:38:58
    //测试线程停止 //1.建议线程正常停止-----利用次数,不建议死循环 //2.建议使用标志位-------设置一个标志位 //3.不要使用stop,destroy等过时或JDK不建议的方法 public class TestStop implements Runnable{ //...

    之前使用过sleep来停止线程

    我们这次使用别的方法来停止线程

    //测试线程停止
    //1.建议线程正常停止-----利用次数,不建议死循环
    //2.建议使用标志位-------设置一个标志位
    //3.不要使用stop,destroy等过时或JDK不建议的方法
    public class TestStop implements Runnable{
        //设置一个标志位
        private boolean flag = true;
        @Override
        public void run() {
            int i = 0;
            while (flag){
                System.out.println("the thread is runing...."+i++);
            }
        }
        //设置一个停止方法
        public void stop(){
            this.flag = false;
        }
    
        public static void main(String[] args) {
            TestStop testStop = new TestStop();
            new Thread(testStop).start();
            for (int i = 0; i < 100; i++) {
                System.out.println("this is main thread "+i);
                if (i == 50){
                    testStop.stop();
                    System.out.println("the thread is stop.");
                }
            }
        }
    }

    执行结果如下:

    可以看到,当主线程到50时,我们更改了run线程的标志位 使它停止  此时run线程跑到了93的地方,主线程并没有停止,他要跑完了才不跑

    使用标志位来停止线程,是一个比较建议的做法

    展开全文
  • 线程停止详解

    2019-11-14 16:12:55
    线程停止 线程停止共三种方法。 1.设置标记位 class ThreadShutDown implements Runnable{ private boolean flag=true; public void setFlag(boolean flag){ this.flag=flag; } @Override public void run(...
  • Java 线程停止

    2016-02-18 20:54:50
    Java 线程停止
  • 线程停止:(1)设置标志位 (2)调用stop() 已经被废弃因为会产生不完整数据 (3)interrupt() 线程的优先级:设置 、取得优先级、最高/中等/最低优先级 守护线程:设置、判断 1.线程常用方法 首先看看下面的...
  • 线程停止的方法:记住一点,线程的停止,1.自己运行完了,2.如果是无限循环,在外部,只能用flag标记来操作。但是当线程处于冻结状态(阻塞),sleep,wait,join,(这三个方法抛出异常。)就不会读取到flag.这个时候,...
  • Java线程状态、线程停止、线程阻塞

    千次阅读 2015-05-28 08:59:44
    Java线程状态、线程停止、线程阻塞
  • 今天调试自己写的一个服务器引擎时候 class cServerBase : cThreadObj ...通过这个小例子,以后自己可以注意一下,如果发现线程停止工作的时候,很有可能是某一个地方死锁了 转载于:https://www....
  • 复杂点的Java应用一般都会开多个线程在后台跑程序,有时候因为发布或其他原因需要停止程序,那就涉及到如何停止Java线程的问题.Java 的线程停止还是比较别扭的,如果是从其他语言转学java,很容易掉进坑里面.一 坑一 ...
  • 1.1线程停止 线程停止描述:停止一个线程意味着在线程处理完任务之前停掉正在执行的操作,也就是放弃当前的操作。 java 终止正在运行线程的三种方法: 1、使用退出标志,使线程正常退出,也就是run方法完成后线程...
  • 42. 线程停止

    2018-04-29 16:18:00
    线程停止无外乎2种,要么是执行完了任务,要么强制停止 线程的停止:  1.我们可以定义一个boolean类型的变量结合notity方法去控制线程的停止(使用notity是为了防止要被停止的线程wait)  2.也可以使用...
  • 1.3线程停止

    2016-01-12 17:40:25
    3)使用interrupt()方法中断线程,但这个方法不会终止一个正在运行的线程,还需要加入一个判断才可以完成线程停止interrupt()仅是停止标志interrupt()只是一个停止标志,并不真正停止线程package com.myThread
  • java线程停止interrupt

    2017-10-25 16:57:28
    说明: 线程在运行过程中可能需要根据条件判断进行停止,从api上开是可以使用stop方法强制终止线程,但是官方不推荐这个方法,这个是作废过期的方法,因为如果强制让线程停止则有可能使一些清理性的工作得不到完成,...
  • 线程停止、中断

    2021-01-12 12:07:04
    线程停止、中断 原理 使用interrupt方法,去通知而不是强制 public class RightWayStopWithoutSleep implements Runnable { @Override public void run() { int num = 0; while (!Thread.currentThread()....
  • 线程停止方式 /** * 停止线程的方式 */ public class J14ThreadCease { public static void main(String[] args) throws InterruptedException { AA aa = new AA(); aa.setNa...
  • Java线程停止的坑

    2020-06-28 22:53:10
    复杂点的Java应用一般都会开多个线程在后台跑程序,有时候因为发布或其他原因需要停止程序,那就涉及到如何停止Java线程的问题.Java 的线程停止还是比较别扭的,如果是从其他语言转学j...
  • 有关线程停止的常用方法有这3个: Thread thread = new Thread(new Test()); void thread.interrupt(); boolean thread.isInterrupted(); boolean Thread.interrupted(); 第一个方法是将thread对象所在的...
  • JAVA线程停止的方法

    2012-01-30 14:10:52
    JAVA线程停止的方法
  • 1. 什么是停止线程停止一个线程意味着在任务处理完任务之前停掉正在做的操作,也就是放弃当前的操作。2. 错误的方式 - 调用Thread.stop()方法虽然停止一个线程可以用Thread.stop()方法,但最好不要用它。它确实可以...
  • Java之多线程学习笔记九 —— 线程五大状态和自定义线程停止方法 线程的五大状态相关知识 Java中的常用方法 线程停止 package pers.ylw.state; //测试线程停止 //1.建议线程正常停止-->利用次数,不建议死...
  • JavaSE-线程停止

    2018-04-26 14:56:47
    线程停止在Java中是一项很有技巧性的操作,虽然看起来很简单,但是我们必须做好防范措施,以便达到预期的效果。 例如,停止一个线程可以直接用Thread.stop()方法,虽然它可以停止一个正在运行的线程,但是这个方法...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 13,769
精华内容 5,507
关键字:

线程停止