java线程方法

join():线程同步

暂停当前线程,等待子线程的执行,也称之为线程合并,join方法特点将并行执行的事情合并为串行执行。例如:如果在ta线程中调用tb.join(),则让ta线程停止执行,并让tb线程先执行,直到tb线程执行完毕,ta线程才能继续执行
join方法是定义在thread类中的普通方法,可以抛出Interrupted中断t.join()是表示当前线程允许t线程插队到自己的前面,等t线程执行完成之后当前线程才继续执行,join方法的调用会让当前线程进入到blocked状态或者是timed_waiting状态。

public final void join() throws InterruptedException {
        join(0);
    }
public final synchronized void join(long millis) throws InterruptedException {
       //获取当前的时间的毫秒
        long base = System.currentTimeMillis();
        long now = 0;

        if (millis < 0) {
            throw new IllegalArgumentException("timeout value is negative");
        }

        if (millis == 0) {
            //isAlive判断子线程是否活着,如果参数为0会一直则塞,线程就不停的等待,直到其他线程通过notify等方法才能唤醒继续执行
            while (isAlive()) {
                wait(0);
            }
        } else {
            while (isAlive()) {
                long delay = millis - now;
                if (delay <= 0) {
                    break;
                }
                wait(delay);
                now = System.currentTimeMillis() - base;
            }
        }
    }
//Object类下的native方法,是一个线程间通信的方法,notify或者notifyAll方法,
public final native void wait(long timeout) throws InterruptedException;
join方法执行的本质是使用线程间通信机制来完成线程同步功能

例题:
线程的顺序打印:给定4个线程,线程名分别为A,B,C,D,让每个线程打印各自名称,按照DCBA来打印
在c线程中调用d.join
在b线程中调用c.join
在a线程中调用b.join

public class JoinDemo extends Thread {
    private Thread thread;
    private String name;

    public JoinDemo(Thread thread, String name) {
        this.thread = thread;
        this.name = name;
    }

    @Override
    public void run() {
        if (thread != null) {
            try {
                //让子线程先执行
                thread.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        //打印当前线程信息
        System.out.println(name);

    }
    
  
          JoinDemo threadd = new JoinDemo(null, "D");
        JoinDemo threadc = new JoinDemo(threadd, "C");
        JoinDemo threadb = new JoinDemo(threadc, "B");
        JoinDemo threada = new JoinDemo(threadb,"A");
        threadd.start();
        threadc.start();
        threadb.start();
        threada.start();

interrupt():中断线程

用来中断当前的线程,终止处于“阻塞状态”的线程
interrupt方法是在Thread类中的一个普通方法,由对象调用该方法
方法:
boolean isInterrupted():判断线程是否发生中断,true:表示中断 false:非中断interrupt():中断方法

方法特点:
interrupt方法执行是对中断标志位做了修改
1、如果线程当前是可中断的阻塞状态(调用sleep、join、wait等方法会导致线程进入到阻塞状态:WAITING/TIMED_WAITING/BLOCKED),
在任意的其他线程调用t.interrupt方法,那么线程会立即抛出一个InterruptedException异常,退出阻塞状态
2、如果线程t当前存储于运行状态,则调用t.interrupt()方法,线程会继续执行,直到发生了阻塞(调用sleep、join、wait)后立即抛出异常,跳出阻塞状态,Interrupt并不会终止处于“运行状态”的线程,其仅仅是对标志位做了修改。

public void interrupt() {
        if (this != Thread.currentThread())
            checkAccess();

        synchronized (blockerLock) {
            Interruptible b = blocker;
            if (b != null) {
                interrupt0();           // Just to set the interrupt flag
                b.interrupt(this);
                return;
            }
        }
        interrupt0();
    }

private native void interrupt0();

deamon:守护线程

方法:
//void setDaemon(boolean on) 设置守护线程 参数:true:设置为守护线程 false:非守护线程。默认false
// boolean isDaemon() 判断当前线程是否是守护线程:true:表示守护线程 false:用户线程java中有两种线程,用户线程和守护线程,可以通过isDaemon()来区分线程是否是守护线程用户线程一般是用来执行用户级任务
守护线程也称之为“后台线程”,服务于用户线程,一般用来执行后台任务 例如“:垃圾回收线程是单独用来处理无用对象的回收的, 负责垃圾回收的线程就是守护线程
守护线程的生命周期:
守护线程的生命周期是依赖于用户线程,当用户线程存在,守护线程就会存活,当用户线程生命终止,守护线程的也会随之消亡

Priority:线程优先级

线程优先级:指导线程的执行的先后顺序的
方法:
//int getPriority() 获取线程的优先级
//setPriority(int newPriority) 设置线程优先级 newPriority必须在1~10之间的整的,默认的是5
优先级特点:
1、java线程的优先级并不绝对,他所控制的是执行的优先机会,优先级的决定权在操作系统,java设置的优先级只能是被优先执行的概率会高一些,并不绝对。
2、java中优先级共有10级,分为1-10,数值越大,表明优先级越高,一般普通的线程优先级是5。
3、优先级具有继承性,如果一个线程B在另一个线程A中创建出来,那么线程B的优先级和线程A保持一致。