多线程-Thread类及常见方法

目录

1.什么是Thread类

1.1Thread 的常⻅构造⽅法

 1.2 Thread 的⼏个常⻅属性

 2.启动⼀个线程 - start()

经典面试题:start 和run 区别

3.中断⼀个线程

方法一:

 方法二:

4.等待⼀个线程 - join()

5. 获取当前线程引用

方法一:

 方法二:


1.什么是Thread类

       Thread类是Java编程语言中的一个重要类,用于支持多线程编程。它是java.lang包中的一部分,提供了创建和管理线程的方法和功能。通过使用Thread类,可以同时执行多个任务,实现并行处理。每个线程都有独立的执行路径,可以在不同的时间段内独立运行。这使得程序能够更高效地利用计算机的资源,并提高应用程序的响应速度。

        Thread类提供了许多方法来管理线程的行为,例如start()方法用于启动线程,join()方法用于等待线程的结束,sleep()方法用于暂停线程的执行等等。此外,还可以使用isAlive()方法检查线程是否处于活动状态。

1.1Thread 的常⻅构造⽅法

多线程-Thread类及常见方法_第1张图片

Thread t1 = new Thread ();
Thread t2 = new Thread ( new MyRunnable ());
Thread t3 = new Thread ( "线程 名字 " );
Thread t4 = new Thread ( new MyRunnable (), "线程 名字 " );

 1.2 Thread 的⼏个常⻅属性

多线程-Thread类及常见方法_第2张图片

 ID 是线程的唯⼀标识,不同线程不会重复

 名称是各种调试⼯具⽤到

 状态表⽰线程当前所处的⼀个情况

优先级⾼的线程更容易被调度到

关于后台线程:前台线程,会阻止进程结束。后台线程,不会阻止进程结束。JVM会在⼀个进程的所有⾮后台线程结束后,才会结束运⾏。
是否存活,即简单的理解,为 run ⽅法是否运⾏结束了
一般来说,在线程的run()方法中,可以通过检查线程的中断标志位来判断线程是否应该中断。如果线程应该中断,则应该适当地结束线程的执行,释放占用的资源,以及清除中断标志位,防止后续影响线程的执行。

 2.启动⼀个线程 - start()

       调用start创建出来新的线程。本质是start会调用系统的api,来完成创建线程的操作。

package 多线程;

public class ThreadDemo5 {
    public static void main(String[] args) {
        Thread t = new Thread(() ->{
            while (true){
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        t.start();

    }
}

注意:Thread类使用start方法,启动一个线程。对于同一个Thread对象来说,start只能调用一次!!!

package 多线程;

public class ThreadDemo5 {
    public static void main(String[] args) {
        Thread t = new Thread(() ->{
            while (true){
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        t.start();

        t.start();//第二次调用start会出错
    }
}

 它就会报错,意思是非法的线程状态异常。多线程-Thread类及常见方法_第3张图片

经典面试题:
start 和run 区别

package 多线程;


class MyThread4 extends Thread{
    @Override
    public void run() {
        System.out.println("hello");
    }
}

public class ThreadDemo6 {
    public static void main(String[] args) {
        Thread t = new MyThread4();
        //t.start();//这个操作是创建一个新的线程,由新的线程执行hello
        t.run();//这个操作还是在main主线程种打印的hello
    }
}

 虽然他们打印的都是hello但是本质是不同的。

3.中断⼀个线程

方法一:

中断一个线程就是让线程提前结束,我们引入一个标志位。

package 多线程;

public class ThreadDemo7 {
    private static boolean isQuit = false;//引入一个标志位

    public static void main(String[] args) {
        Thread t = new Thread(()->{
            while (!isQuit) {
                System.out.println("正在工作中!");

                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            //当前是死循环,给一个提示。
            System.out.println("线程工作完毕!");
        });

        t.start();

        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println("t线程结束");
        isQuit = true;
    }
}

 我们就可以让一直运行的线程提前结束。

具体线程什么时候结束,取决于在另一个线程中何时修改isQuit的值

多线程-Thread类及常见方法_第4张图片

 方法二:

Thread对象,内置了变量。

package 多线程;

public class ThreadDemo8 {
    public static void main(String[] args) throws InterruptedException{
        Thread t = new Thread(()->{
            while (!Thread.currentThread().isInterrupted()){//获取当前线程实例
                System.out.println("正在工作");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
//                    e.printStackTrace();
                    //加上break,此时抛出异常之后,线程也会结束。
                    break;
                }
            }
            System.out.println("线程执行完毕");
        });
        t.start();

            Thread.sleep(3000);

        System.out.println("t线程结束");
           //使用interrupt方法来修改刚才的标志位
        t.interrupt();

    }
}

多线程-Thread类及常见方法_第5张图片

4.等待⼀个线程 - join()

       join()是Thread类提供的一个方法,用于等待线程的结束。当调用一个线程的join()方法时,当前线程会被阻塞,直到目标线程执行完毕。

        具体来说,当一个线程A调用另一个线程B的join()方法时,线程A会暂停执行,直到线程B执行完毕。这样可以保证线程的执行顺序和协调性。

package 多线程;

public class ThreadDemo9 {
    public static void main(String[] args) throws InterruptedException {
        Thread t = new Thread(()->{
            for (int i = 0; i < 5; i++) {
                System.out.println("一个线程正在工作。。。");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println("线程结束");
        });
        t.start();

        t.join();
        System.out.println("这是主线程,希望在t线程后打印");
    }
}

多线程-Thread类及常见方法_第6张图片

5. 获取当前线程引用

方法一:

package 多线程;

class MyThread5 extends Thread{
    @Override
    public void run() {
        //这个代码如果想获取到线程的引用,直接使用this即可
        System.out.println(this.getId() + "," + this.getName());
    }
}

public class ThreadDemo11 {
    public static void main(String[] args) throws InterruptedException {
        MyThread5 t1 = new MyThread5();
        MyThread5 t2 = new MyThread5();
        t1.start();
        t2.start();

        Thread.sleep(1000);

        System.out.println(t1.getId() + "," + t1.getName());
        System.out.println(t2.getId() + "," + t2.getName());
    }
}

多线程-Thread类及常见方法_第7张图片

 方法二:

用Thread.currentThread()
package 多线程;
//获取当前线程引用
public class ThreadDemo12 {
    public static void main(String[] args) {
        Thread t1 = new Thread(()->{
            Thread t = Thread.currentThread();
            System.out.println(t.getName());
        });
        Thread t2 = new Thread(()->{
            Thread t = Thread.currentThread();
            System.out.println(t.getName());
        });

        t1.start();
        t2.start();
    }
}

希望大家多多支持!

你可能感兴趣的:(java,java,开发语言)