线程基本方法

1。设置线程名
    继承Thread类的线程,可以直接使用.setName()方法,设置线程名。也可以使用构造方法,需要注意java默认不继承构造方法,所以需要自己调用下父类的构造方法。

public class Demo {
    public static void main(String[] args) {
        MyThread myThread1=new MyThread("飞机");
        myThread1.start();
        MyThread myThread2=new MyThread();
        myThread2.setName("火箭");
        myThread2.start();
        //当jvm虚拟机启动后,会自动的启动多条线程,其中一条是main主线程
        //主线程的作用是调用main方法,并执行其中的代码,在以前,我们写的所有代码,其实都是运行在main线程中
        Thread thread=Thread.currentThread();
        System.out.println(thread.getName());

        //获取优先级
        System.out.println(myThread1.getPriority());
        //线程的默认优先级都是5,包括main线程
    }
}
public class MyThread extends Thread {
    @Override
    public void run() {
        for (int i = 0; i < 100; ++i) {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            //在不设置线程名的情况下,线程名默认是Thread+线程序号
            System.out.println(getName());
        }
    }

    //构造方法子类默认不继承,所以这里需要通过super关键字调用父类Thread的构造方法,给Thread设置名字
    public MyThread() {
    }

    public MyThread(String name) {
        super(name);
    }
}

 实现runnable接口的线程,可以使用.setName方法。但是不能使用构造方法,因为他不像上面继承Thread类的线程,他没有父类的构造方法可以调用。

public class Mythread implements Runnable {
    @Override
    public void run() {
        for (int i = 0; i < 100; ++i) {
            String name = Thread.currentThread().getName();
            System.out.println("你好世界!"+"----"+name);
        }
    }
}
public class Demo {
    public static void main(String[] args) {
        Mythread mythread=new Mythread();

        Thread t1=new Thread(mythread);
        t1.setName("线程1");
        Thread t2=new Thread(mythread);
        t2.setName("线程2");

        t1.start();
        t2.start();
        //获取优先级
        System.out.println(t1.getPriority());
    }
}

2. join方法  当前线程需要等待 调用join方法的线程执行完毕,当前线程才能继续执行

public class Demo {
    public static void main(String[] args) throws InterruptedException {
        MyThread myThread = new MyThread();
        myThread.start();

        // 在默认情况下,当前线程和在当前线程添加的线程会交替执行
        // 使用了join方法后,当前线程会等待myThread执行完毕,后继续执行本线程
        myThread.join();
        for (int i = 0; i < 10; i++) {
            Thread.sleep(1);//模拟主线程执行耗时
            System.out.println(Thread.currentThread().getName());
        }
    }
}
public class MyThread extends Thread {
    @Override
    public void run() {
        for (int i = 0; i < 100; ++i) {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("自定义线程"+i);
        }
    }
}

执行结果:MyThread执行完后,才执行main线程的输出语句

线程基本方法_第1张图片

3。

setDaemon

守护线程:当其他非守护线程执行完毕,守护线程不管是否执行完毕,都会停止。

就像舔狗(守护线程)和女神(非守护线程),如果女神走了,那舔狗啥都不管,也走。

主线程

public class Demo {
    public static void main(String[] args) {
        NvShenThread nvShenThread=new NvShenThread();
        TianGouThread tianGouThread =new TianGouThread();
        //将舔狗线程设置为守护线程 守护线程:当其他非守护线程执行完毕,会自动停止守护线程
        //应用场景:qq聊天和发送文件,聊天框关闭,发送文件也应当停止
        tianGouThread.setDaemon(true);
        nvShenThread.start();
        tianGouThread.start();
    }
}

女神线程(非守护线程)

public class NvShenThread extends Thread {
    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            try {
                Thread.sleep(2);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("女神线程执行"+"----"+i);
        }
    }
}

舔狗线程(守护线程)

public class TianGouThread extends Thread {
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            try {
                Thread.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("舔狗线程执行"+"----"+i);
        }
    }
}

你可能感兴趣的:(#多线程,java基础,java,开发语言)