Java种可以使用Thread类来创建线程:语法

    步骤:

    1. 指定执行线程的目标:定义一个Thread子类,重写run方法,将相关的逻辑实现

      1. public void **run**():将需要的逻辑写在里面,该方法相当于线程种的main方法
    2. 创建自定义线程的子类对象

    3. 开启线程操作 - 触发

    public void start():只要调用了这个方法,线程才会启动,开始执行

    Thread中的相关的方法:
    public final String getName():获取到线程的名字
    public final void setName():设置线程的名字
    public static Thread currentThread():获取当前的线程对象
    yield():释放当前cpu的执行权
    join():在线程A中调用线程B的join()方法,此时线程A就进入阻塞状态直到线程B完全执行完以后,线程A才结束阻塞状态
    stop():强制线程生命期结束,不推荐使用(过时)
    sleep():让当前线程“睡眠”指定的millitime毫秒。在指定的millitime毫秒是时间内,当前线程是阻塞状态
    isAlive():判断当前线程是否还存活

    线程的运行默认是不可控的,是CPU随机调用的,我们只能看到运行的结果

    1. package ThreadDemo;/*
    2. @create 2021--01--05--20:36
    3. */
    4. public class ThreadTest2 {
    5. public static void main(String[] args) {
    6. MyThread1 myThread1 = new MyThread1("Thread:1");
    7. MyThread2 myThread2 = new MyThread2();
    8. //myThread1.setName("线程一");
    9. myThread2.setName("线程二");
    10. myThread1.start();
    11. myThread2.start();
    12. Thread.currentThread().setName("主线程");
    13. for (int i = 0; i < 100; i++) {
    14. if (i % 2 == 0) {
    15. System.out.println(Thread.currentThread().getName() + "-->" + i);
    16. }
    17. if (i == 20) {
    18. try {
    19. myThread1.join();
    20. } catch (InterruptedException e) {
    21. e.printStackTrace();
    22. }
    23. }
    24. }
    25. System.out.println(myThread1.isAlive());
    26. }
    27. }
    28. class MyThread1 extends Thread {
    29. @Override
    30. public void run() {
    31. for (int i = 0; i < 100; i++) {
    32. if (i % 2 == 0) {
    33. try {
    34. sleep(1000);
    35. } catch (InterruptedException e) {
    36. e.printStackTrace();
    37. }
    38. System.out.println(Thread.currentThread().getName() + "-->" + i);
    39. }
    40. if (i % 20 == 0) {
    41. this.yield();
    42. }
    43. }
    44. }
    45. //构造器方式给线程命名
    46. public MyThread1(String name) {
    47. super(name);
    48. }
    49. }
    50. class MyThread2 extends Thread {
    51. @Override
    52. public void run() {
    53. for (int i = 0; i < 100; i++) {
    54. if (i % 2 != 0) {
    55. System.out.println(Thread.currentThread().getName() + "-->" + i);
    56. }
    57. }
    58. }
    59. }
    package Test21_Demo.Demo10;/*
    
        @create 2020--12--14--15:19
    */
    
    /**
     * 自定义线程类
     * <p>
     * 定义一个Thread的子类!
     *
     * 创建线程的第一种方式:继承Thread类
     */
    public class MyThread extends Thread {
    
        //重写run方法 - 相关的逻辑
        @Override
        public void run() {
            for (int i = 0; i < 50; i++) {
                /**
                 * this表示当前正在被调用的线程
                 * 获取线程的名字是Java干的事情(Java定义的),我们不管,只要看就行
                 */
                System.out.println(this.getName() + " : " + i);
            }
        }
    }
    
    package Test21_Demo.Demo10;/*
    
        @create 2020--12--14--15:12
    */
    
    public class ThreadDemo {
        //主线程
        public static void main(String[] args) {
            //创建线程对象    -   用于开启线程
            Thread t1 = new MyThread();
            Thread t2 = new MyThread();
    
            //开启线程 - 会直接运行
            t1.start();
            t2.start();
            System.out.println("_______________________________");
    
            //返回一个main线程 - 其实就是main方法的线程
            Thread mainThread = Thread.currentThread();
            System.out.println(mainThread);//Thread[main,5,main]
    
            for (int i = 0; i < 50; i++) {
                System.out.println(mainThread.getName() +" : "+ i);
            }
        }
    }
    

    第二种方式:
    步骤:

    1. 指定线程执行的目标:定义Runnable接口,并且实现接口,重写run方法,指定目标逻辑
    2. 通过指定线程执行目标的构造方法创建线程对象

    public Thread(Runnable target)
    创建线程并且执行目标对象
    通过线程执行目标对象创建线程对象

    1. 开启线程操作(start)

    好处:将任务和线程相分离,耦合度比较低,使用也更加的广泛。

    package Test21_Demo.Demo10;/*
    
        @create 2020--12--14--15:36
    */
    
    /**
     *创建线程的第二种方式
     * 实现Runnable接口
     *
     * 1.实现接口,并且要实现run方法
     * 2.在run方法中添加逻辑代码
     * 3.通过start启动线程
     */
    public class MyRunnable implements Runnable{
    
        @Override
        public void run() {
            //返回当前线程
            Thread thisThread = Thread.currentThread();
            for (int i = 0; i < 20; i++) {
                System.out.println(thisThread.getName() + " : " + i);
            }
        }
    }
    
    package Test21_Demo.Demo10;/*
    
        @create 2020--12--14--15:12
    */
    
    /**
     * 第二种方式:
     */
    public class ThreadDemo2 {
        //主线程
        public static void main(String[] args) {
            //创建线程执行目标
            MyRunnable mr = new MyRunnable();//线程对象 - 任务
            //通过指定线程执行目标的构造函数来创建线程
            Thread thread1 = new Thread(mr);//线程名称
            thread1.setName("Jack");
            Thread thread2 = new Thread(mr);//线程名称
            thread2.setName("Rose");
    
            //开启线程
            thread1.start();
            thread2.start();
        }
    }