一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第6天,点击查看活动详情。
1.1 进程
- 进程:是正在运行的程序
- 是系统进行资源分配和调用的独立单位
- 每一个进行都有它自己的内存空间和系统资源
- 进程的三个特征
- 独立性:进程与进程之间是相互独立的,彼此有自己独立内存区域
- 动态性:进程是运行中的程序,要动态的占用内存,CPU和网络等资源
- 并发性:CPU会分时轮询切换依次为每个进程服务,因为切换的速度非常快,给我们的感觉像是在同时执行,这就是并发性(并发:同一时刻同时有多个在执行)
1.2 线程
- 线程:是进程中的单个顺序控制流,是一条执行路径
- 单线程:一个进程只有一条执行路径
- 多线程:一个进程有多条执行路径
1.3 多线程的实现方式
1.3.1 方式1:继承Tread类
-
流程:
- 1、定义一个MyTread类继承Tread类
- 2、在MyTread类中重写
run()方法 - 3、创建MyTread类的对象
- 4、启动线程:
void start()
-
为什么要重写run()方法?
- 因为run()是用来封装被线程执行的代码
-
run()方法和start()方法的区别?
- run():封装线程执行的代码,直接调用,相当于普通方法的的调用
- start():启动线程,然后由JVM调用此线程中的run()方法
-
范例
-
MyTread类:
package test;
//1、定义一类MyTread继承Tread类
public class MyThread extends Thread{
////2、在MyTread类中重写run()方法
@Override
public void run() {
for(int i=0;i<100;i++) {
System.out.println(i);
}
}
}
- 测试类
package test;
public class Demo {
public static void main(String[] args) {
//3、创建MyTread类的对象
MyThread my1 = new MyThread();
MyThread my2 = new MyThread();
//4、启动线程:void start():启动线程,由Java虚拟机调用此线程的run()方法
my1.start();
my2.start();
}
}
1.3.2 方式2:实现Runnable接口
- 流程:
- 1、定义一个MyRunnable类实现Runnable接口
- 2、在MyRunnable类中重写
run()方法 - 3、创建MyRunnable类的对象
- 4、创建Tread类的对象,把MyRunnable对象作为构造方法的参数
- 5、启动线程
- 好处:
- 避免了Java单继承的局限性
- 适合多个相同程序的代码取处理同一个资源的情况,把线程和程序的代码、数据有效分离,较好地体现了面向对象的设计理论
package test;
public class Demo {
public static void main(String[] args) {
//3、创建MyRunnable类的对象
MyRunnable mr = new MyRunnable();
//4、创建Tread类的对象,把MyRunnable对象作为构造方法的参数
// Thread t1 = new Thread(mr);
// Thread t2 = new Thread(mr);
//Thread(Runnable target,String name)
Thread t1 = new Thread(mr,"高铁");
Thread t2 = new Thread(mr,"飞机");
//5、启动线程
t1.start();
t2.start();
}
}