join、中断线程与其他方法

public final void join( ) throws InterruptedException
等待这个线程死亡。

调用此方法的行为方式与调用完全相同
join (0)

异常InterruptedException -如果任何线程中断当前线程。当抛出此异常时, 当前线程的中断状态将被清除。

public void interrupt()
中断这个线程。
除非当前线程中断自身,这是始终允许的

public static boolean interrupted()
测试当前线程是否中断。该方法可以清除线程的中断状态。换句话说,如果这个方法被连续调用两次,那么第二个调用将返回false (除非当前线程再次中断,在第一个调用已经清除其中断状态之后,在第二个调用之前已经检查过)。
忽略线程中断,因为线程在中断时不存在将被该方法返回false所反映。
自定义标记中断线程

中断线程:
1、使用interrupt方法来中断线程,设置中断状态(标记),容易被很多方法清除,需要加判断,处理清理相对麻烦
2、自定义标记中断线程(推荐),更灵活

代码示例:

package com.booy;

import static java.lang.Thread.interrupted;

public class ThreadDemo2 {
    public static void main(String[] args) {
        MyRunnable1 mr = new MyRunnable1();
        Thread t = new Thread(mr);
        t.start();
        MyRunnable2 mr2 = new MyRunnable2();
        Thread t2 = new Thread(mr2);
        t2.start();
        //主线程
        for (int i = 0; i <50 ; i++) {
            System.out.println(Thread.currentThread().getName()+"--"+i);
            try {
                Thread.sleep(300);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            if(i == 20){
//                try {
//                    t.join();//等待t2执行完毕
//                } catch (InterruptedException e) {
//                    e.printStackTrace();
//                }
                mr2.flag = false;
            }
//            t.interrupt();//1、线程中断标记,具体中断取决于线程自身

        }
    }
}
class MyRunnable1 implements Runnable{
    @Override
    public void run() {
        for (int i = 0; i <50 ; i++) {
//            if(Thread.interrupted()){//3、测试中断状态
//                break;
//            }
            System.out.println(Thread.currentThread().getName()+"--"+i);
            try {
                Thread.sleep(300);//线程休眠
            } catch (InterruptedException e) {
                e.printStackTrace();
//                Thread.currentThread().interrupt();//2、避免标记被异常清除无法返回中断状态
            }
        }
    }
}
//自定义中断
class MyRunnable2 implements Runnable{
    public boolean flag = true;
    public MyRunnable2(){
        flag = true;
    }
    @Override
    public void run() {
        while (flag){
            int i = 0;
            System.out.println(Thread.currentThread().getName()+"--"+(i++));
        try {
            Thread.sleep(300);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
}

守护线程与yield

public final void setDaemon(boolean on)
将此线程标记为daemon线程或用户线程。当运行的唯线程都是守护进程线程时, Java虚拟机将退出。

public final boolean isDaemon()
测试这个线程是否是守护线程。

public static void yield()
暂停当前正在执行的线程对象,并执行其他线程。( 了解)

其他方法与优先级
long getld():返回该线程的标识符。

String getName():返回该线程的名称。

void setName(String name):改变线程名称,使之与参数name相同。

boolean isAlive():测试线程是否处于活动状态。

void setPriority(int newPriority):更改线程的优先级。优先级高可以提高该线程抢cpu时间片的概率

static int MAX_ PRIORITY:线程可以具有的最高优先级。

static int MIN PRIORITY:线程可以具有的最低优先级。

static int NORM PRIORITY:分配给线程的默认优先级。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值