Java线程之interrupt终止线程,Thread中的主要方法(五)

如何停止线程

  • stop方法有其固有的不安全性,一般不使用。
    而是使用的Thread类中提供的interrupt方法

public void interrupt()中断线程。 如果当前线程没有中断它自己(这在任何情况下都是允许的),则该线程的
checkAccess 方法就会被调用,这可能抛出 SecurityException。

如果线程在调用 Object 类的 wait()、wait(long) 或 wait(long, int) 方法,或者该类的
join()、join(long)、join(long, int)、sleep(long) 或 sleep(long, int)
方法过程中受阻,则其中断状态将被清除,它还将收到一个 InterruptedException。

  • 如何控制线程的结束?
    通过结束线程任务的循环就可以结束线程

  • 思路:- - ->定义标记
    但是会发现,如果线程处于了冻结状态,无法读取标记。
    – - ->:强制读取标记
    可以使用interrupt()方法将线程从冻结状态强制恢复到运行状态中来,让线程具备cpu的执行资格。
    强制动作会发生了InterruptedException,如果不处理则恢复的线程继续向下执行,同样不能解决问题,所以一定要处理
    应该在异常catch里强制终止,把标记赋值false
    */

class Interrupt implements Runnable
{
    private boolean flag = true;
    public synchronized void run()
    {
        while (flag)
        {
            try
            {
                wait();//如果线程等待后被唤醒,将从这开始继续向下执行,不会判断标记
            }
        catch (InterruptedException ex)
            {System.out.println(Thread.currentThread().getName()+"exception...");}
        System.out.println(Thread.currentThread().getName()+"run.........");
        }
    }
    void setFlag(boolean flag)
    {
        this.flag = flag;
    }
}

class  StopThread
{
    public static void main(String[] args) 
    {
        Interrupt in = new Interrupt();

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

        t1.start();
        t2.setDaemon(true);
        t2.start();
        int count = 0;
        //t1,用于演示interrupt,t2用于演示setDaemon
        while(true)
        {
            if(count++==20)
            {
                in.setFlag(false);
                t1.interrupt();
                break;
            }
            System.out.println(Thread.currentThread().getName()+"主进程run"+count);    
        }
        System.out.println("main 结束");
    }
}

这里写图片描述


Thread中其他方法

  • setDaemon

public final void setDaemon(boolean
on)将该线程标记为守护线程或用户线程。当正在运行的线程都是守护线程时,Java 虚拟机退出。 该方法必须在启动线程前调用。

该方法首先调用该线程的 checkAccess 方法,且不带任何参数。
这可能抛出 SecurityException(在当前线程中)。

简单的说,就是前台线程如果都结束了,守护线程(后台线程/联合线程)就自动结束

  • join

public final void join()
throws InterruptedException等待该线程终止。

用于临时申请加入线程执行,那么当前运行的线程等待此线程结束才有CPU执行资格

  • setPriority(int newPriority)

    更改线程的优先级。

    t1.setsetPriority(Thread.MAX_MAX_PRIORITY),只是表示优先级最大,获取CPU执行权的几率越大,并不一定最先执行。

  • toString()

    返回该线程的字符串表示形式,包括线程名称、优先级和线程组。

  • yield()

    暂停当前正在执行的线程对象,并执行其他线程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值