一个进程,通常可以包含若干个线程,线程是 CPU 调度和执行的单位。
线程就是独立的执行路径;
在程序运行时,即使没有自己创建线程,后台也会有多个线程,如主线程,gc 线程;
main() 为主线程,即系统的入口,用于执行整个程序;
在一个进程中,如果开辟了多个线程,线程的运行由调度器安排调度,调度器是与操作系统紧密相关的,先后顺序是不能人为干预的;
对同一份资源操作时,会存在资源抢夺的问题,需要加入并发控制;
线程会带来额外的开销,如 CPU 调度时间,并发控制开销;
每个线程只能在自己的工作内存中交互,内存控制不当会造成数据不一致。
普通方法调用和多线程
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4j9K3lsm-1635691815680)(https://img10.360buyimg.com/ddimg/jfs/t1/141212/26/27751/207535/617e9574Ed49c8f12/5de91c494e9fb485.png)]
三种实现方式
Thread class —— 继承 Thread 类(重点)
Runnable 接口 —— 实现 Runnable 接口(重点)
Callable 接口 —— 实现 Callable 接口(了解)
Thread 实现
自定义线程类继承 Thread 类
重写 run() 方法,编写线程执行体
创建线程对象,调用 start() 方法启动线程
package Thread; // 创建线程方式1:继承 Thread 类,重写 run() 方法,调用 start 开启线程 // 总结:注意,线程开启不一定立即执行,由 CPU 调度执行 public class TestThread1 extends Thread{ @Override public void run() { // run 方法线程体 for (int i=0; i<20; i++) { System.out.println("我在写代码----" + i); } } public static void main(String[] args) { // main 线程,主线程 // 创建一个线程对象 TestThread1 testThread1 = new TestThread1(); // 调用 start 方法开启线程 testThread1.start(); for (int i = 0; i < 20; i++) { System.out.println("我在学习多线程----" + i); } } }