多线程(停止线程)

多线程的停止方法stop已经过时,所以停止线程的方法只有一种,run方法结束。因为多线程

运行的代码通常都是循环结构的,只要控制住循环就可以让run方法结束,也就是线程结束。(使用标记控制循环)

PS:

特殊情况:

当线程处于了冻结状态,就不会读取到标记,那么线程就不会结束。

当没有指定的方法让冻结的线程恢复运行时,需要对冻结状态进行清除,

Thread类提供了专门用于清除线程冻结状态的方法——interrupt

停止线程示例:

class stopThreadDemo
{
    public static void main(String[] args)
    {
        //创建并开启两个线程
        stopThread st = new stopThread();

        Thread t1 = new Thread(st);
        Thread t2 = new Thread(st);

        t1.start();
        t2.start();
        //创建一个计数器
        int num = 0;
        //主线程中循环输出
        //若当主线程输出了60句则停止输出并改变标记停止开启的两条线程。
        while (true)
        {
            if (num++ == 60)
            {
                st.changeFlag();
                break;
            }
            System.out.println(Thread.currentThread().getName()+"............."+num);
        }

    }
}

class stopThread implements Runnable
{
    private boolean flag = true;
    public void run()
    {
        while (flag)
        {
            System.out.println(Thread.currentThread().getName()+"...run...");
        }
    }
//修改标记的方法
    public void changeFlag()
    {
        flag = false;
    }
}

通过标记停止线程

特殊情况停止线程示例:

class stopThread implements Runnable
{
    private boolean flag = true;
    //线程一运行因标记为真,会进入冻结状态,放弃执行资格。
    public synchronized void run()
    {
        int num = 0;
        while (flag)
        {
            try
            {
                this.wait();
            }
            catch (InterruptedException e)
            {
                //若线程被强制唤醒则会抛出一个InterruptedException(中断异常)
                System.out.println(Thread.currentThread().getName()+"..Exception..");
                //如果发生了InterruptedException(中断异常)则说明有人在强制唤醒线程,而唤醒的目的是为了让线程结束
                this.changeFlag();
            }
            System.out.println(Thread.currentThread().getName()+"...运行了..."+num++);
        }
    }
//修改标记的方法
    public void changeFlag()
    {
        flag = false;
    }
}

class stopThreadDemo
{
    public static void main(String[] args)
    {
        //创建并开启两个线程
        stopThread st = new stopThread();

        Thread t1 = new Thread(st);
        Thread t2 = new Thread(st);

        t1.start();
        t2.start();
        //创建一个计数器
        int num = 0;
        //主线程循环输出
        //若当主线程输出了60句则停止输出,并通过interrupt方法将陷入休眠状态的线程强制唤醒。
        while (true)
        {
            if (num++ == 60)
            {
                t1.interrupt();
                t2.interrupt();
                break;
            }
            System.out.println(Thread.currentThread().getName()+"............."+num);
        }

    }
}

当线程冻结时结束线程的方法

时间: 2024-10-07 05:27:00

多线程(停止线程)的相关文章

JAVA-初步认识-第十四章-多线程-停止线程方式-定义标记

一. 线程既然开启了,运行了,冻结又恢复运行了,那什么时候消亡呢? 怎么来停止线程呢?不能一直在运行. 线程怎么停,线程自己最清楚.在Thread类中,提供了stop方法, 本来线程持有一个锁,只要stop,它就什么都在放,这是强制操作,无论出于什么状态,强制将其搞定.本来wait,这那儿的,stop一下子就没了. stop方法做的不是状态切换了,而是消失. 线程停止,其实只有一种,就是run方法结束. 线程一旦没有自己运行的代码了,任务没有了,线程自动就结束了.可是线程的任务怎么能没有呢? 标

java多线程---停止线程

@Deprecated public final void stop() jdk源码中Thread的stop()方法已经被弃用了.那么怎么停止线程的呢? thread.interrupt();这就是需要用到的方法 一般建议使用抛异常的方法来实现停止线程.因为在catch块里可对异常信息进行相关处理. 如下: public class StopThread extends Thread{ /** * 停止一个线程可用Thread.stop(),但这个方法是不安全的,被弃用的.别用 * 还可以用Th

JAVA-初步认识-第十四章-多线程-停止线程方式-interrupt

一. 结合上一节继续讲述,不要以为设置了标记线程就能停止,依旧有停不下来的情况. 整个函数就是添加了wait()方法,导致try-catch的加入. DOS结果显示,程序没有停下来,和主线程结束了.其余两个线程都没结束,都处于等待状态. 这两个线程拿到锁进来后,都wait停在这了. 设置标记也没用,因为这两个线程就没读到标记. 有人说采用notify方法,但是notify要在同一个锁中,在这个程序中放不了. 如果程序中不用wait,用sleep呢?而且sleep时间比较长,比如说一个小时,没有一

java多线程之停止线程

在多线程开发中停止线程是很重要的技术点.停止线程在Java语言中并不像break语句那样干脆,需要一些技巧性的处理. 一.  异常法 采用异常法来停止一个线程,首先我们需要了解一下两个方法的用法: 1.interrupt()方法 public class MyThread extends Thread{ @Override public void run() { for (int i = 1; i <= 10000; i++) { System.out.println("i="+

JAVA学习第二十八课(多线程(七))- 停止线程和多线程面试题

重点掌握 /* * wait 和 sleep 区别? * 1.wait可以指定时间也可以不指定 * sleep必须指定时间 * 2.在同步中,对CPU的执行权和锁的处理不同 * wait释放执行权,释放锁    sleep释放执行权,不释放锁 */ //同步里具备执行资格的线程不止一个,但是能得到锁的只有一个,所以能执行的也只有一个 一.停止线程的方式 不可能让线程一直在运行,所以需要让线程停止 1.定义循环结束标记 一般而言,线程运行代码都是循环的,只要控制了循环就可以结束任务 2.使用int

多线程(四) 如何停止线程

在Thread类中提供了可以停止线程的方法(包括杀死和挂起): @Deprecated public final void stop(){} @Deprecated public final void suspend(){} stop 和 suspend 添加的有Deprecated注释,也即是该方法已经废弃使用.那么为什么会不建议使用这两种方法呢?还有没有其他停止线程的方法? 1.stop()会立即杀死线程,无法保证原子操作能够顺利完成,存在数据错误的风险.无论线程执行到哪里.是否加锁,sto

二、java多线程编程核心技术之(笔记)——如何停止线程?

1.异常法 public class MyThread extends Thread { @Override public void run() { super.run(); try { for (int i = 0; i < 5000000; i++) { if(this.interrupted()){ System.out.println("我要停止了....."); throw new InterruptedException(); \\抛出异常 } System.out.

多线程---其他方法 停止线程、守护线程、join方法

第三方停止线程: 原来是stop(),因为该方法有些问题,所以被interrupt()方法取代,它的用途跟机制是 当没有指定的方式让冻结的线程恢复到运行状态时,这时需要对冻结进行清除,强制让线程恢复到运行状态中来,这样就可以让操作标记来结束线程. Thread类提供了interrupt()方法. 守护线程: 线程对象.setDaemon():该方法表示,前台线程(主线程) 一结束,后台线程(后台运行线程)立即结束. Join方法: 等待该线程终止.就是说在主线程运行时候,读到了该线程的开始阶段,

Java多线程开发系列之四:玩转多线程(线程的控制1)

在前文中我们已经学习了:线程的基本情况.如何创建多线程.线程的生命周期.利用已有知识我们已经可以写出如何利用多线程处理大量任务这样简单的程序.但是当应用场景复杂时,我们还需要从管理控制入手,更好的操纵多线程.在第一节中我们讲过,使用多线程的好处之一就是我们可以通过编码和已有类库更好的管理和控制多线程.接下来我会详细的介绍如何管理多线程,包括:对线程的等待.守护线程.线程的睡眠.线程的突然停止.线程的让步.线程的优先级等.由于内容比较多,本节先介绍前两部分:对线程的等待.守护线程 1.线程的等待