java复习第6天---多线程----6.2--多线程和多线程实现

java复习第6天---多线程----6.2--多线程和多线程实现

目录




内容

1、多线程

1.1、进程和线程

  • 什么是进程,什么是线程?
    进程:是并发执行的程序在执行过程中分配和管理资源的基本单位,是一个动态概念,竞争计算机系统资源的基本单位。

  • 线程:是进程的一个执行单元,是进程内科调度实体。比进程更小的独立运行的基本单位。线程也被称为轻量级进程。

一个程序至少一个进程,一个进程至少一个线程。

  • 进程线程的区别

    1. 地址空间:同一进程的线程共享本进程的地址空间,而进程之间则是独立的地址空间。
    2. 资源拥有:同一进程内的线程共享本进程的资源,但是进程之间的资源是独立的。
    3. 一个进程崩溃后,在保护模式下不会对其他进程产生影响,但是一个线程崩溃整个进程都死掉。所以多进程要比多线程健壮。
    4. 进程切换时,消耗的资源大,效率高。所以涉及到频繁的切换时,使用线程要好于进程。同样如果要求同时进行并且又要共享某些变量的并发操作,只能用线程不能用进程。
    5. 执行过程:每个独立的进程程有一个程序运行的入口、顺序执行序列和程序入口。但是线程不能独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
    6. 线程是处理器调度的基本单位,但是进程不是。
    7. 两者均可并发执行。
  • 优缺点:
    1.线程执行开销小,但是不利于资源的管理和保护。线程适合在SMP机器(双CPU系统)上运行。
    2.进程执行开销大,但是能够很好的进行资源管理和保护。进程可以跨机器前移。

参考地址:https://blog.csdn.net/QQ1608731824/article/details/81461269

1.2、线程调度

  目前没有深入理解,可自行搜索或者参考博文:
https://blog.csdn.net/sdp1103285470/article/details/93602329
https://www.iteye.com/blog/youyu4-2351235

2、线程创建方式

上图2-1:

在这里插入图片描述

2.1、线程创建方式1

  • 格式

      修饰符 class 类名 extends Thread {
      	@override
      	public void run() {
      		...
      	}
      }
      new 类名().start(); // 启动线程
    
  • 示例2.1-1:

      package thread.create;
    
      public class MyThread extends Thread{
    
      	@Override
      	public void run() {
      		for(int i = 0; i < 10; i++) {
      			System.out.println("MyThread:" + i);
      		}
      	}
    
      }
      
      package thread.create;
    
      public class TestThread1 {
      	public static void main(String[] args) {
      		Thread th = new MyThread();
      		th.start();
    
      		for(int i =0; i < 10; i++) {
      			System.out.println("main:" + i);
      		}
      	}
      }
      测试结果:
      main:0
      MyThread:0
      main:1
      MyThread:1
      main:2
      MyThread:2
      main:3
      MyThread:3
      MyThread:4
      main:4
      MyThread:5
      main:5
      MyThread:6
      MyThread:7
      MyThread:8
      main:6
      main:7
      main:8
      main:9
      MyThread:9
    

2.2、Thread常用方法

  实现多线程,需要继承Thread类。

  • 构造方法:
修饰符返回值类型方法名参数描述
publicThread创建新的线程对象
publicThreadString name创建指定名称的线程对象
publicThreadRunnable target分配指定目标的线程对象
publicThreadRunnable target, String name分配指定目标,指定名称的线程对象
  • 常用方法:
修饰符返回值类型方法名参数描述
publicStringgetName获取线程名称
publicvoidstart线程开始执行;JVM自动调用run方法
publicvoidrun线程要执行的任务此处定义
publicvoidsleeplong millis线程休眠指定时间
public staticThreadcurrentThread返回当前正在执行线程对象的引用

2.3、线程创建方式2

  第二种方式为实现Runnable接口。步骤如下:

  1. 创建Runnable接口的实现类
  2. 在实现类中重写run方法,设置线程任务
  3. 创建Runnable接口实现类的对象
  4. 创建Thread的对象,构造中传递Runnable接口实现类的对象
  5. 调用Thread对象start方法,开启线程
  • 示例2.3-1:

      package thread.create;
    
      public class MyRunnableThread implements Runnable{
    
      	@Override
      	public void run() {
      		for(int i = 0; i < 10; i++) {
      			System.out.println(Thread.currentThread().getName()+ ":" + i);
      		}
    
      	}
    
      }
      
      package thread.create;
    
      public class TestMyRunableThread {
      	public static void main(String[] args) {
      		Thread th = new Thread(new MyRunnableThread());
      		th.start();
    
      		for(int i = 0; i < 10; i++) {
      			System.out.println(Thread.currentThread().getName() + ":" + i);
      		}
      	}
      }
      测试结果:
      main:0
      Thread-0:0
      main:1
      Thread-0:1
      main:2
      Thread-0:2
      main:3
      main:4
      main:5
      main:6
      main:7
      main:8
      main:9
      Thread-0:3
      Thread-0:4
      Thread-0:5
      Thread-0:6
      Thread-0:7
      Thread-0:8
      Thread-0:9
    

2.4、匿名内部类的方式创建线程

package thread.create;

public class TestThread2 {
	public static void main(String[] args) {
		new Thread(new Runnable() {

			@Override
			public void run() {
				for(int i = 0; i < 10; i++) {
					System.out.println("MyThread:" + i);
				}				
			}

		}).start();

		for(int i = 0; i < 10; i++) {
			System.out.println(Thread.currentThread().getName() + ":" + i);
		}
	}
}
测试结果:
main:0
MyThread:0
main:1
MyThread:1
main:2
MyThread:2
main:3
MyThread:3
MyThread:4
MyThread:5
MyThread:6
MyThread:7
MyThread:8
MyThread:9
main:4
main:5
main:6
main:7
main:8
main:9

2.5、Runnable与Thread 创建线程比较

  用Runnable实现多线程比用Thread实现多线程具有的优势:

  1. 适合多个相同程序代码的线程共享同一个资源
  2. 可以避免java中单继承的局限性
  3. 增加程序的健壮性,实现解耦操作,代码可以被多个线程共享,代码和线程独立
  4. 线程池只能放入实现Runnable或Callable类的线程,不能直接放入继承Thread类

后记

本项目为参考某马视频开发,相关视频及配套资料可自行度娘或者联系本人。上面为自己编写的开发文档,持续更新。欢迎交流,本人QQ:806797785

前端项目源代码地址:https://gitee.com/gaogzhen/vue-leyou
后端JAVA源代码地址:https://gitee.com/gaogzhen/JAVA
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

gaog2zh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值