ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

多线程(一)-两种创建线程的方式

2022-06-20 16:04:18  阅读:132  来源: 互联网

标签:执行 run Thread 创建 --- 线程 序号 多线程


大佬的理解->Java多线程(一)多线程基础

大佬的理解->Java多线程(二)常用的实现多线程的两种方式

1、继承Thread类

​ 继承Thread必须重写run方法,(具体业务执行方法,需要执行的业务方法,定义在此方法中),注意此方法是线程启动后线程自动调用的;

案例

public class MyThread extends Thread{

    @Override
    public void run() {
        //线程执行的业务方法
        System.out.println("子线程执行");
        for (int i = 0;i < 5;i++){
            System.out.println("--- 线程名---:"+Thread.currentThread().getName()+",序号:"+i);
        }
    }

    public static void main(String[] args) {
        //主线程
        System.out.println("***主线程执行***");
        System.out.println("***线程名***:"+Thread.currentThread().getName());

        //创建一个线程并启动,只能通过主线程创建其他线程
        MyThread thread1 = new MyThread();
        MyThread thread2 = new MyThread();

        //启动线程:start()方法(一旦启动,自动启动子线程,当前线程继续向下执行,不会等子线程)
        thread1.start();

        //启动多线程
        //多线程并发执行:不是正真一样上的并行执行(肉眼感官是并行),而是通过cpu的调度算法,有序cpu执行极快,所以肉眼看起来是并行的;
        thread2.start();

        //调用run方法,不可以启动线程,就是对象的普通方法调用,等run方法执行结束,主线程才能继续执行
        //thread1.run();

        System.out.println("----主线程执行结束----");

    }
}

运行结果

***主线程执行***
***线程名***:main
----主线程执行结束----
子线程执行
--- 线程名---:Thread-0,序号:0
--- 线程名---:Thread-0,序号:1
--- 线程名---:Thread-0,序号:2
--- 线程名---:Thread-0,序号:3
--- 线程名---:Thread-0,序号:4
子线程执行
--- 线程名---:Thread-1,序号:0
--- 线程名---:Thread-1,序号:1
--- 线程名---:Thread-1,序号:2
--- 线程名---:Thread-1,序号:3
--- 线程名---:Thread-1,序号:4

注意start()方法和run()方法的区别

start():启动线程start()方法(一旦启动,自动启动子线程,当前线程继续向下执行,不会等子线程);
run() :调用run方法,不可以启动线程,就是对象的普通方法调用,等run方法执行结束,主线程才能继续执行;

2、实现Runnable接口

必须实现run方法;

案例

public class MyRunnable implements Runnable{

    private int num = 5;

    @Override
    public void run() {
        //线程执行的业务方法
        System.out.println("子线程执行");
        for (int i = 0;i < 5 ;i++){
            if(num>0){
                System.out.println("--- 线程名---:"+Thread.currentThread().getName()+",序号:"+num--);
            }
        }
    }

    public static void main(String[] args) {
        //主线程
        System.out.println("***主线程执行***");
        System.out.println("***线程名***:"+Thread.currentThread().getName());

        //创建一个子线程,并启动
        MyRunnable runnable1 = new MyRunnable();

        //实现Runnable接口方式创建的线程,不能自己启动,只能通过Thread类,将Runnable作为参数传入Thread类的构造方法中,
        // 构造线程对象,才可以启动
        Thread thread1 = new Thread(runnable1);
        thread1.start();
        //创建多线程 (如果传入的Runnable参数一样,可以共享资源)
        Thread thread2 = new Thread(runnable1);
        thread2.start();

        System.out.println("----主线程执行结束----");

    }

}

运行结果

***主线程执行***
***线程名***:main
----主线程执行结束----
子线程执行
子线程执行
--- 线程名---:Thread-0,序号:5
--- 线程名---:Thread-1,序号:4
--- 线程名---:Thread-0,序号:3
--- 线程名---:Thread-1,序号:2
--- 线程名---:Thread-0,序号:1

注意

如果传入的Runnable参数一样,可以共享资源;

3、比较两种创建线程的方式

继承Thread类

  • 编写简单,可直接操作线程
  • 适用于单继承

实现Runnable接口

  • 避免单继承局限性
  • 便于共享资源

标签:执行,run,Thread,创建,---,线程,序号,多线程
来源: https://www.cnblogs.com/xiaoqigui/p/16393353.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有