多线程-线程创建方式1:继承Thread类

线程创建方式1:继承Thread类

概述

  • Java语言的JVM允许程序运行多个线程,使用java.lang.Thread类代表线程,所有的线程对象都必须是Thread类或其子类的实例。
  • Thread类的特性
    • 每个线程都是通过某个特定Thread对象的run()方法来完成操作的,因此把run()方法体称为线程执行体
    • 通过该Thread对象的start()方法来启动这个线程,而非直接调用run()。
    • 要想实现多线程,必须在主线程中创建新的线程对象。

方式1:继承Thread类

Java通过继承Thread类来创建启动多线程的步骤如下:

  1. 定义Thread类的子类,并重写该类的run()方法,该run()方法的方法体就代表了线程需要完成的任务
  2. 创建Thread子类的实例,即创建了线程对象
  3. 调用线程对象的start()方法来启动该线程
1. 线程的创建方式一:继承Thread类
1.1 步骤:
(1)创建一个继承于Thread类的子类
(2)重写Thread类的run()方法--->将此线程要执行的操作,声明在方法体中
(3)创建当前Thread的子类的对象
(4)通过对象调用start()方法
    start()方法作用:1.启动线程 2.调用当前线程的run()方法
package thread.demo01;


//例题:创建一个分线程1,用于遍历100以内的偶数

public class EvenNumberTest {
    public static void main(String[] args) {

//(3)创建当前Thread的子类的对象
        PrintNumber t1 = new PrintNumber();

//(4)通过对象调用start()方法
        t1.start();

        //运行了结果看起来和在main()方法中执行的结果一样,看不出来什么新线程。一起运行试试
        //main()所在的线程执行的操作:
        for (int i = 1; i <= 100; i++) {
            if (i % 2 == 0){
                //System.out.println(i + "**********");
                //一起运行后查看结果发现出现了交互现象,比如
                    /*
                    56
                    30**********
                    58
                     */
                //说明两个线程在交替执行
                System.out.println(Thread.currentThread().getName() + ":" + i + "**********" );//直观一点看,直接显示线程名
                //运行结果举例:
                /*
                main:4**********
                Thread-0:20
                main:6**********
                 */
            }
        }

       /*
       问题1:能否使用t1.run()替换t1.start()的调用,实现分线程的创建和调用?答:不能。
        */
       //t1.run();//相当于主线程中调了一个普通的run()方法

        /*
        问题2:再提供一个分线程,遍历100以内的偶数。

        注意:不能让已经start()的线程,再次执行start(),否则报异常IllegalThreadStateException(非法线程状态)
         */
//        t1.start();
        //可以重新建一个对象,再次调用start()
        PrintNumber t2 = new PrintNumber();
        t2.start();

    }

}

//(1)创建一个继承于Thread类的子类
class PrintNumber extends Thread {

//(2)重写Thread类的run()方法--->将此线程要执行的操作,声明在方法体中
    @Override
    public void run() {
        for (int i = 1; i <= 100; i++) {
            if (i % 2 == 0){
                System.out.println(Thread.currentThread().getName() + ":" + i);
            }
        }
    }
}

在这里插入图片描述

练习:创建两个分线程,其中一个线程遍历100以内的偶数,另一个线程遍历100以内的奇数。

package thread.demo01.exercise1;

public class PrintNumberTest {
    public static void main(String[] args) {    //main()主线程
        //方式1:
//        Even t1 = new Even();
//        Odd t2 = new Odd();
//        t1.start();
//        t2.start();

        //方式2:创建Thread类的匿名子类的匿名对象。
        new Thread(){   //偶数
            @Override
            public void run() {
                for (int i = 1; i <= 100; i++) {
                    if (i % 2 == 0){
                        System.out.println(Thread.currentThread().getName() + ": ---- " + i);
                    }
                }
            }
        }.start();

        new Thread(){   //奇数
            @Override
            public void run() {
                for (int i = 1; i <= 100; i++) {
                    if (i % 2 != 0){
                        System.out.println(Thread.currentThread().getName() + ": " + i);
                    }
                }
            }
        }.start();


    }
}

class Even extends Thread{  //用于打印偶数
    @Override
    public void run() {
        for (int i = 1; i <= 100; i++) {
            if (i % 2 == 0){
                System.out.println(Thread.currentThread().getName() + ": ---- " + i);
            }
        }
    }
}

class Odd extends Thread{   //用于打印奇数
    @Override
    public void run() {
        for (int i = 1; i <= 100; i++) {
            if (i % 2 != 0){
                System.out.println(Thread.currentThread().getName() + ": " + i);
            }
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值