java复习第6天---多线程----6.2--多线程和多线程实现
目录
文章目录
内容
1、多线程
1.1、进程和线程
-
什么是进程,什么是线程?
进程:是并发执行的程序在执行过程中分配和管理资源的基本单位,是一个动态概念,竞争计算机系统资源的基本单位。 -
线程:是进程的一个执行单元,是进程内科调度实体。比进程更小的独立运行的基本单位。线程也被称为轻量级进程。
一个程序至少一个进程,一个进程至少一个线程。
-
进程线程的区别
- 地址空间:同一进程的线程共享本进程的地址空间,而进程之间则是独立的地址空间。
- 资源拥有:同一进程内的线程共享本进程的资源,但是进程之间的资源是独立的。
- 一个进程崩溃后,在保护模式下不会对其他进程产生影响,但是一个线程崩溃整个进程都死掉。所以多进程要比多线程健壮。
- 进程切换时,消耗的资源大,效率高。所以涉及到频繁的切换时,使用线程要好于进程。同样如果要求同时进行并且又要共享某些变量的并发操作,只能用线程不能用进程。
- 执行过程:每个独立的进程程有一个程序运行的入口、顺序执行序列和程序入口。但是线程不能独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
- 线程是处理器调度的基本单位,但是进程不是。
- 两者均可并发执行。
-
优缺点:
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类。
- 构造方法:
修饰符 | 返回值类型 | 方法名 | 参数 | 描述 |
---|---|---|---|---|
public | Thread | 创建新的线程对象 | ||
public | Thread | String name | 创建指定名称的线程对象 | |
public | Thread | Runnable target | 分配指定目标的线程对象 | |
public | Thread | Runnable target, String name | 分配指定目标,指定名称的线程对象 |
- 常用方法:
修饰符 | 返回值类型 | 方法名 | 参数 | 描述 |
---|---|---|---|---|
public | String | getName | 获取线程名称 | |
public | void | start | 线程开始执行;JVM自动调用run方法 | |
public | void | run | 线程要执行的任务此处定义 | |
public | void | sleep | long millis | 线程休眠指定时间 |
public static | Thread | currentThread | 返回当前正在执行线程对象的引用 |
2.3、线程创建方式2
第二种方式为实现Runnable接口。步骤如下:
- 创建Runnable接口的实现类
- 在实现类中重写run方法,设置线程任务
- 创建Runnable接口实现类的对象
- 创建Thread的对象,构造中传递Runnable接口实现类的对象
- 调用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实现多线程具有的优势:
- 适合多个相同程序代码的线程共享同一个资源
- 可以避免java中单继承的局限性
- 增加程序的健壮性,实现解耦操作,代码可以被多个线程共享,代码和线程独立
- 线程池只能放入实现Runnable或Callable类的线程,不能直接放入继承Thread类
后记 :
本项目为参考某马视频开发,相关视频及配套资料可自行度娘或者联系本人。上面为自己编写的开发文档,持续更新。欢迎交流,本人QQ:806797785
前端项目源代码地址:https://gitee.com/gaogzhen/vue-leyou
后端JAVA源代码地址:https://gitee.com/gaogzhen/JAVA