一、进程、线程、多线程
进程:电脑中每一个单独运行的程序,都是一个进程。进程是系统进行资源分配的独立实体,且每个进程拥有独立的地址空间。一个进程可以拥有多个线程,每个线程使用其所属进程的栈空间。
线程:是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。一个进程中至少包含一个线程。
多线程:一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务(交替占用CPU,并非真正的并行执行,线程每次执行时长由分配的CPU时间片长度决定)。多线程同步完成多项任务,不是为了提高运行效率,而是为了提高资源使用效率来提高系统的效率。
优点:
1.使用多线程可以把程序中占据时间长的任务放到后台去处理,如图片、视屏的下载;
2.发挥多核处理器的优势,并发执行让系统运行的更快、更流畅,用户体验更好。
3.充分利用CPU资源,简化编程模型。
缺点:
1.大量的线程降低代码的可读性;
2.更多的线程需要更多的内存空间;
3.当多个线程对同一个资源出现争夺时候要注意线程安全的问题。
二、主线程
- main()方法即为主线程入口
- 产生其他子线程的线程
- 必须最后完成执行,因为它执行各种关闭动作
Thread类:Java提供了java.lang.Thread类支持多线程编程
显示主线程名:
public static void main(String[] args) {
// 获取 主线程信息
Thread t = Thread.currentThread();
// 通过getName() 获取当前主线程名称
System.out.println(t.getName());
t.setName("MyThread");// 为当前的主线程 命名
System.out.println(t.getName());
}
三、线程的创建和启动
创建一个线程的两种方法:
1. 通过继承Thread类来创建线程:
- 定义MyThread类继承Thread类
- 重写run()方法,编写线程执行体
- 创建线程对象,调用start()方法启动线程
public class MyThread_1 extends Thread{
// 重写 run() 方法 自己定义运行时的内容
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println(Thread.currentThread().getName()+"-"+i);
}
}
}
public class DemoB {
public static void main(String[] args) {
System.out.println(Thread.currentThread().getName());
MyThread_1 myThread_1 = new MyThread_1();
myThread_1.setName("测试A-");
MyThread_1 myThread_2 = new MyThread_1();
myThread_2.setName("测试B-");
// 启动MyThread_1 线程
// 当调用线程子类的 start(); 方法 启动了 线程类 执行 run()方法
myThread_1.start();
myThread_2.start();
// 直接调用run()方法
// myThread_1.run();
// myThread_2.run();
}
}
问题:启动线程是否可以直接调用run()方法?
不可以。如果直接调用run方法,那么进程中就只有主线程一条执行路径。调用start()方法,多条执行路径