/*
    多线程的创建,方式一: 继承于Thread类
    1.创建一个继承于Thread类的子类
    2.重写Thread类的run() —> 将此线程执行的操作声明在run()中
    3.创建Thread类的子类的对象
    4.通过此对象调用start()


    例子:遍历100以内的所有的偶数
    *
    说明两个问题:
    问题一:我们启动一个线程,必须调用start(),不能调用run()的方式启动线程
    问题二:如果再启动一个线程,必须重新创建一个Thread子类的对象,调用此对象的start()

    1. package com.atguigu.java1;
    2. /**
    3. * 多线程的创建,方式一: 继承于Thread类
    4. * 1.创建一个继承于Thread类的子类
    5. * 2.重写Thread类的run() --> 将此线程执行的操作声明在run()中
    6. * 3.创建Thread类的子类的对象
    7. * 4.通过此对象调用start()
    8. * <p>
    9. * 例子:遍历100以内的所有的偶数
    10. *
    11. * @author Dxkstart
    12. * @create 2021-05-05 20:17
    13. */
    14. public class ThradTest {
    15. public static void main(String[] args) {
    16. //3.创建Thread类的子类的对象
    17. MyThread my = new MyThread();
    18. //4.通过此对象调用start(): ①启动当前线程 ②调用当前线程的run()
    19. my.start();//线程1
    20. //问题一:我们不能通过直接调用run()的方式启动线程
    21. // my.run();
    22. //问题二:再启动一个线程,遍历200以内的偶数。不可以还让已经start()的线程去执行。
    23. // my.start(); 报错:IllegalThreadStateException
    24. //我们需要重新创建一个线程的对象
    25. MyThread my2 = new MyThread();
    26. my2.start();//线程2
    27. //如下的方法仍然是main线程中执行的
    28. for (int i = 0; i <= 200; i++) {
    29. if (i % 2 == 0) {
    30. System.out.println(Thread.currentThread().getName() + ":" + i + "********mian()******** ");
    31. }
    32. }
    33. }
    34. }
    35. //1.创建一个继承于Thread类的子类
    36. class MyThread extends Thread {
    37. // 2.重写Thread类的run()
    38. @Override
    39. public void run() {
    40. for (int i = 0; i <= 200; i++) {
    41. if (i % 2 == 0) {
    42. System.out.println(Thread.currentThread().getName() + ":" + i);//获取当前线程的名字
    43. }
    44. }
    45. }
    46. }