Java中实现线程的两种方式

刺骨的言语ヽ痛彻心扉 2023-03-01 10:23 83阅读 0赞

关于多线程的基本概述:

1、什么是进程?什么是线程?

进程是一个应用程序。
线程是一个进程中执行场景,执行单元。

一个进程可以启动多个线程。
进程与进程之间内存独立不共享。


2、在java语言中:

任意两个线程与线程之间,堆内存和方法区内存共享,因为堆内存和方法区只有一个。

但是栈内存独立,一个线程一个栈。栈内存有很多个。

假设有10个线程,会有10个栈空间,每个栈之间互不干扰,各自执行。
这就是多线程并发执行。


3、java中之所以有多线程机制,目的就是为了提高程序的效率。

思考:使用了多线程机制之后,main()方法结束后,是不是有可能程序也不会结束。

main()方法结束只是主线程结束,主栈空了,其他线程的栈可能还在压栈弹栈。


4、在java中实现线程有2种方法:

(1)第一种方法:编写一个类,直接继承java.lang.Thread,并重写run()方法。

怎么创建线程?直接new对象。
怎么启动线程?调用对象的start()方法。

  1. public class MyThread extends Thread {
  2. // 重写父类的run()方法
  3. public void run() {
  4. // 代码块
  5. }
  6. }
  7. MyThread myThread = new MyThread();
  8. myThread.start();

注意:start()方法调用时,启动一个分支线程,在JVM中开辟一个新的栈空间。
只有栈空间开出来了,start()方法在被调用的地方,瞬间出栈消失。

线程启动后,会自动调用run()方法,并且run()方法在分支栈的底部。
run()方法在分支栈底部,main()方法在主栈底部。

如果直接启动对象的run()方法呢?而不是通过start()去启动run()呢?
这样的话就不会去开辟新栈空间了,还是在当前栈中执行的run()方法。

测试代码:

  1. public class Test01 {
  2. public static void main(String[] args) {
  3. // 这里是main()方法,属于主线程,对应一个主栈
  4. // 创建分支线程对象
  5. MyThread myThread = new MyThread();
  6. // 启动分支线程,这行代码瞬间就结束了,因为它只起到开辟线程栈的功能
  7. // 线程执行的时间跟这句代码没有关系
  8. // 注意:方法体中的代码永远都是自上而下,逐行执行,这是亘古不变的
  9. myThread.start();
  10. // 如果是这种调用,只是普通的方法调用
  11. // myThread.run();
  12. // 这里的代码还是在主线程中
  13. for (int i = 0; i < 100; i++) {
  14. System.out.println("主线程---->" + i);
  15. }
  16. }
  17. }
  18. // 编写一个类,继承Thread,重写run()方法
  19. class MyThread extends Thread {
  20. @Override
  21. public void run() {
  22. for (int i = 0; i < 100; i++) {
  23. System.out.println("分支线程---->" + i);
  24. }
  25. }
  26. }

运行截图:
在这里插入图片描述


(2)实现线程的第二种方法:

编写一个类,实现java.lang.Runnable接口,实现接口中的run()方法。 再创建线程Thread对象。

怎么创建线程?直接new线程Thread对象,传一个类型为Runnable接口类型对象。
怎么启动线程?调用Thread对象的start()方法。

  1. public class MyRun implements Runnable {
  2. // 实现接口中的run()方法
  3. public void run() {
  4. // 代码块
  5. }
  6. }
  7. Thread thread = new Thread(new MyRun());
  8. thread.start();

注意:两种方式都能实现多线程,但第二种方式面向接口更常用。
因为一个类实现了接口,它还可以去继承其他的类,更灵活。

测试代码:

  1. public class Test02 {
  2. public static void main(String[] args) {
  3. // 主线程main()方法的栈执行
  4. // 创建可运行的参数对象
  5. //MyRun myRun = new MyRun();
  6. // 将可运行对象封装成线程对象
  7. //Thread thread = new Thread(myRun);
  8. // 以上两行代码可以合并
  9. Thread thread = new Thread(new MyRun());
  10. // 启动线程
  11. thread.start();
  12. // 也可以采用匿名内部类方式,直接new接口,这种方式不建议使用,代码不能复用
  13. Thread thread1 = new Thread(new Runnable() {
  14. @Override
  15. public void run() {
  16. for (int i = 0; i < 100; i++) {
  17. System.out.println("分支2线程--->" + i);
  18. }
  19. }
  20. });
  21. thread1.start();
  22. // 这是主线程中执行的代码
  23. for (int i = 0; i < 100; i++) {
  24. System.out.println("主线程--->" + i);
  25. }
  26. }
  27. }
  28. // 这个class还不是线程类,只是一个普通可运行的类
  29. class MyRun implements Runnable {
  30. @Override
  31. public void run() {
  32. for (int i = 0; i < 100; i++) {
  33. System.out.println("分支1线程--->" + i);
  34. }
  35. }
  36. }

运行截图:
在这里插入图片描述


发表评论

表情:
评论列表 (有 0 条评论,83人围观)

还没有评论,来说两句吧...

相关阅读

    相关 实现线方式

    实现线程的两种方式 什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。程序员可以通过它进行多处理器编程,你可以使用多线

    相关 Java创建线方式

    创建线程的目的是为了开启一条执行路径,去运行指定的代码和其他代码,实现并行运行。 (实际上时根据操作系统的调度算法,分时间片运行,但由于cpu处理速度很高,宏观上看成时同时