多线程
- 程序 就是指令和数据的有序集合,其本身没有任何运行含义 是一个静态概念
- 进程 是执行程序的一次执行过程 它是一个动态的概念. 是系统资源分配的单位
- 通常在一个进程中可以包含若干个线程 当然一个进程中至少有一个线程 不然没有存在的意义. 线程是CPU调度和执行的单位
- ***注意:***不少多线程事模拟出来的,真正的多线程是指有多个cpu 即多核 如服务器 如果是模拟出来的多线程, 即在一个cpu的情况下 在同一时间点 cpu只能执行一个代码, 因为切换的很快,所以就有同时执行的错觉.
- 线程 就是独立的执行路径
- 在程序运行时 即使没有自己创建的线程,后台也会有多个线程 如主线程 gc线程
- main()称之为主线程 为系统的入口, 用于执行整个程序
- 在一个进程中 如果开辟了多个线程 线程的运行有调度器安排调度. 调度器与操作系统密切相关 先后顺序不能人为干预
- 对同一份资源操作时 会存在资源抢夺的问题 需要加入并发控制
- 线程会带来额外的开销 如cpu调度时间 并发控制开销
- 每个线程在自己的工作内存交互 内存控制不当会造成数据不一致
线程创建
-
方式一
- 继承Thread类 重写run()方法,编写线程执行体
- 创建线程对象 调用**start()**方法启动线程
public class Demo01 {
public static void main(String[] args) {
//主线程
Thread1 thread1 = new Thread1();
// thread1.run(); //只有主线程一条执行路径
thread1.start(); //多条执行路径 主线程和子线程交替执行
for (int i = 0; i < 100; i++) {
System.out.println("主线程在运行");
}
}
}
class Thread1 extends Thread{
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println("线程1在运行");
}
}
}
-
方式二(推荐)
- 定义MyRunnable类实现Runnable接口
-
实现run()方法 编写线程执行体
- 创建线程对象 new Thread(接口对象).start()方法启动线程
-
避免单继承局限性 方便同一个对象被多个线程使用
package com.wu.thread;
public class Demo04 implements Runnable{
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println("子线程运行" + i);
}
}
public static void main(String[] args) {
Demo04 demo04 = new Demo04();
// Thread thread = new Thread(demo04);
// thread.start();
new Thread(demo04).start();
for (int i = 0; i < 10; i++) {
System.out.println("主线程运行" + i);
}
}
}