千家信息网

Java多线程中如何创建线程

发表于:2025-11-16 作者:千家信息网编辑
千家信息网最后更新 2025年11月16日,这篇文章主要介绍Java多线程中如何创建线程,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、三种创建方式基于什么创建创建的方式Thread类继承Thread类Runnable
千家信息网最后更新 2025年11月16日Java多线程中如何创建线程

这篇文章主要介绍Java多线程中如何创建线程,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

    一、三种创建方式

    基于什么创建创建的方式
    Thread类继承Thread
    Runnable接口实现Runnable接口
    callable接口实现callable接口

    二、通过Thread类创建

    2.1 步骤

    • 自定义线程类继承Thread

    • 重写run()方法,编写线程执行体(当成main()方法用)

    • 创建线程对象,调用start()方法启动线程

    2.2 案例

    • 创建两个线程,其中一个线程打印100以内的偶数,另一个线程打印100以内的奇数

    //主方法public class Demo01 {    public static void main(String[] args) {        Thread1 thread1 = new Thread1();        Thread2 thread2 = new Thread2();        thread1.start();        thread2.start();    }}//100以内的偶数class Thread1 extends Thread {    @Override    public void run() {        for (int i = 0; i < 100; i++) {            if (i%2==0){                System.out.println(Thread.currentThread().getName() + ":" + i);            }        }    }}//100以内的奇数class Thread2 extends Thread {    @Override    public void run() {        for (int i = 0; i < 100; i++) {            if (i%2!=0){                System.out.println(Thread.currentThread().getName() + ":" + i);            }        }    }}
    • 也可以使用匿名内部类的方法来实现(线程用过以后就不再用了)

    public class Demo02 {    public static void main(String[] args) {        //打印0~100内的偶数        new Thread(){            @Override            public void run() {                for (int i = 0; i < 100; i++) {                    if (i%2==0){                        System.out.println(Thread.currentThread().getName() + ":" + i);                    }                }            }        }.start();        //打印0~100内的奇数        new Thread(){            @Override            public void run() {                for (int i = 0; i < 100; i++) {                    if (i%2!=0){                        System.out.println(Thread.currentThread().getName() + ":" + i);                    }                }            }        }.start();    }}
    • 三个窗口同时卖票,票数总共为100张(注意票数应该是静态变量,否则就是没创建一个对象,该对象就有100张票)

    public class Test {    public static void main(String[] args) {        Window w1 = new Window("窗口 1 ");        Window w2 = new Window("窗口 2 ");        Window w3 = new Window("窗口 3 ");        w1.start();        w2.start();        w3.start();    }}class Window extends Thread{    //这里票的数量应该是静态变量,否则每个对象创建后都有100张票,而不是总共100张票    private static int tickets = 100;    public Window(String name) {        super(name);    }    @Override    public void run() {        while (tickets > 0){            tickets--;            System.out.println(getName() + "卖出了一张票,剩余票数:" + tickets);        }    }}
    • 注意:这里存在一个线程安全问题未解决,后面将会讲到。如下图所示,刚开始三个线程启动的时候,读取的票数都是100张。

    2.3 注意的问题

    • start()方法的作用:通过调用自己写的线程类对象的start()方法,来启动该线程,并调用该线程的run()方法

    • 不能通过直接调用run()方法的方式启动线程

    • 不可以让已经start()的线程再次star()来同时跑两个线程。可以通过新建一个该线程类的对象,然后在对新建的对象start()

    三、Thread类中常用的方法

    • start()启动当前线程;调用当前线程的run()方法

    • run():通常需要重写Thread类中的此方法,将创建线程需要执行的操作声明在此方法中(当做main()使用)

    • currentThread():静态方法,返回执行当前代码的线程

    • getName():获取当前线程的名字

    • setName(String name):设置当前线程的名字

    • yield():释放当前CPU的执行权(但也有可能下一刻的执行权又回到了当前线程,主控权还是在CPU手上)

    • join():在线程a中调用线程bjoin(),此时线程a就进入阻塞状态,直到线程b完全执行完之后,线程a在结束阻塞状态

    • stop():当执行此方法时,强制结束当前线程(已停用

    • sleep(int millitime):让当前线程"睡眠"指定的millitime毫秒。在指定的millitime毫秒时间内,当前进程是阻塞状态

    • isAlive():判断当前线程是否存活(线程执行完之前都是存活的)

    3.1 案例

    • 同样是上面的三个窗口买票的问题,同样是100张票,但使用这种创建方法,tickets可以不使用静态变量


    四、通过实现Runnable接口来创建线程

    4.1 创建步骤

    • 创建一个实现了Runnable接口的类

    • 实现类去实现Runnable接口中的抽象方法:run()

    • 创建实现类的对象

    • 将此对象作为参数传递到Thread类的构造器中,创建Thread类的对象

    • 通过Thread类的对象调用start()

    • 这里的start()首先启动了当前的线程,然后调用了Runnable类型的target的run()


    五、继承Thread类和实现Runnable接口两种方式比较

    开发中,优先选择实现Runnable接口的方式创建线程

    原因:

    • 实现Runnable接口的方式没有类的单继承性的局限性(一个类只能继承一个父类,继承了Thread类就不能在继承其他类了)

    • 实现Runnable接口的方式更适合来处理多个线程之间有共享数据的情况

    联系:Thread类本身也实现了Runnable接口

    相同点:两种方式都需要重写run()方法,将线程要执行的逻辑声明在run()方法中

    六、线程的优先级设置

    调度策略

    • 对于同优先级的线程,组成先入先出队列(先到先服务),使用时间片策略

    • 对于高优先级,使用优先调度的抢占式模式

    线程的优先级分为1~10十个档,其中:

    • NORM_PRIORITY:5 -- 普通优先级,即默认的优先级

    • MAX_PRIORITY:10 -- 最高优先级

    • MIN_PRIORITY:1 -- 最低优先级

    • getPriority():获取线程的优先级

    • setPriority(int p):设置线程的优先级

    注意:高优先级的线程要抢占低优先级线程CPU的执行权。但是只是从概率上来讲,高优先级的线程高概率的情况下被执行。并不意味着只有当高优先级的线程被执行完以后,低优先级的线程才会被执行。

    以上是"Java多线程中如何创建线程"这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注行业资讯频道!

    线程 方法 优先级 接口 对象 方式 票数 静态 三个 偶数 变量 奇数 执行权 此方法 状态 问题 阻塞 两个 内容 同时 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 淮安软件开发诚信合作 数据库的关键字和约束怎么用 如何选择好的视频聊天软件开发 个人网络技术能力 嘉定区标准网络技术哪家好 软件开发造价标准 如何设置ug加工数据库 数据库系统改进设想 谷歌商店咋更换服务器 怎么去学网络安全 福建中小学生教育与网络安全 数据库创建包含两个表的视图 收件服务器主机名怎么填写163 危害网络安全视频事件 在网络安全中保密指的是 软件开发好了怎么放在网上 网络安全和舆情管理办法 新形势下网络安全建设探讨 数据库同步更新表数据 神通数据库版本号查询 360网络技术支持 我的世界rpg服务器有哪些东西 如何打造网络安全环境 姜堰区多功能网络技术联系方式 保护网络安全的英语手抄报 什么软件开发人才好 服务器安全狗ddos有用吗 危害网络安全视频事件 全员网络安全六条禁令图片 北京开源网络技术有限公司
    0