线程(Thread)和进程(Process)的关系
程序:指代码,是一个静态的概念。
线程:指方法,如:main( ), 一个进程中至少有一个线程,也可包含若干个线程。
进程:程序运行的一次过程,是一个动态的概念。
注:
很多多线程是模拟出来的,真正的多线程是指有多个cpu,即多核,如服务器。
如果是模拟出来的多线程,即在一个cpu的情况下,在同一个时间点,cpu只能执行一个代码。因为切换的很快,所以就有同时执行的错觉。如:边吃饭边看手机,在某一个时间点,只吃饭或只看手机。
一、什么是线程?
线程是一条执行路径,是程序执行时的最小单位,它是进程的一个执行流,是CPU调度和分派的基本单位,一个进程可以由很多个线程组成,线程间共享进程的所有资源,每个线程有自己的堆栈和局部变量。线程由CPU独立调度执行,在多CPU环境下就允许多个线程同时运行。同样多线程也可以实现并发操作,每个请求分配一个线程来处理。
二、线程的实现
🔮 继承Thread类
思路:
1.自定义线程类继承Thread类
public class TestThread1 extends Thread {
2.重写 run( )方法,编写线程执行体
@Override
public void run(){
//run方法线程体
for (int i = 0; i < 200; i++) {
System.out.println("我在看代码--------"+i);
}
}
3.创建线程对象,调用start( )方法启动线程
//main线程,主线程
public static void main(String[] args) {
//创建一个线程对象
TestThread1 testThread1 = new TestThread1();
//调用start()方法,开启线程
testThread1.start();
for (int i = 0; i < 2000; i++) {
System.out.println("我在学习多线程--------"+i);
}
}
注意:线程开启不一定立即执行,由cpu调度执行
🔮 实现Runnable接口
思路:
1. 定义MyRunnable类实现Runnable接口
public class TestThread2 implements Runnable {
2. 实现run( )方法,编写线程执行体
@Override
public void run() {
for (int i = 0; i < 200; i++) {
System.out.println("我在看代码-------"+i );
}
}
3. 创建线程对象,调用start( )方法启动线程
public static void main(String[] args) {
//创建Runnable接口的实现类对象
TestThread2 testThread2 = new TestThread2();
//创建线程对象,通过线程对象来开启线程————静态代理
/**
Thread thread = new Thread(testThread2);
thread.start();
*/
new Thread(testThread2).start();
for (int i = 0; i < 2000; i++) {
System.out.println("我在学习多线程------"+i);
}
}
🔮 实现Callable接口 [了解]
思路:
1.实现Callable接口,需要返回值类型
2.重写call( )方法,需要抛出异常
3.创建目标对象
4.创建执行服务
5.提交执行
6. 获取结果
7.关闭服务
🔍 总结
-
继承Thread类
-
子类继承Thread类具有多线程能力
-
启动线程:子类对象 . start( )
-
不建议使用:避免OOP单继承局限性
-
-
实现Runnable接口
-
-
实现Runnable接口具有多线程能力
-
启动线程:静态代理——传入目标对象+Thread对象 . start( )
-
推荐使用:避免单继承局限性,方便同一个对象被多个线程使用
-