线程,进程和锁的使用
1.1 什么是进程
一个独立的程序,向系统申请资源
1. CPU 使用率
2. 内存 占用率
特征:
1. 互斥性
2. 独立性
3. 并发性
1.2 什么是线程
线程就是当前程序内的一个功能模块,很多软件(进程)可以同时处理多个事情。这种形式就是线程的理念
线程使用的资源是【进程】提供的
抢占式运行!!!
进程内的不同线程,是抢占CPU和内存资源,同时在抢占CPU的执行时间片!!!
特征:
1. 资源共享
2. 资源抢占
3. 并发性
1.3 进程和线程的区别
进程的资源分配是由系统控制的
线程的资源分配是由进程控制的
1.4 线程的优缺点
优点:
1. 可以同时处理多个业务,提高用户体验
2. 可以更好的利用CPU和内存资源
缺点:
1. 处理业务过多的情况下,会导致用户体验不好,卡
2. 提高CPU和内存的压力,占用过多的系统资源
3. 存在【共享资源问题】
1.5 线程的创建方式
a. 自定义线程类,继承Thread类型,重写run方法,在run方法中完成线程代码。
b. 自定义线程类,遵从Runnable接口,实现run方法,在run方法中完成线程代码
【墙裂推荐】
使用遵从Runnable接口的方式来完成自定义线程类的定义,因为Java中的所有的类都是单继承模式,如果一个类继承Thread类,就无法继承其他类,会影响代码中的逻辑。但是遵从接口,只是拓展了当前类的一个功能,不会影响原本的代码逻辑。
/**
* 继承Thread类实现自定义线程类
*/
class MyThread1 extends Thread {
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println("继承Thread类完成的自定义线程");
}
}
}
/**
* 遵从Runnable接口实现自定义线程类
*/
class MyThread2 implements Runnable {
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println("遵从Runnable接口完成的自定义线程");
}
}
}
public class Demo1 {
public static void main(String[] args) {
// 1. 创建自定义线程类对象
MyThread1 myThread1 = new MyThread1();
/*
2. 启动线程不能直接调用run方法,需要使用Thread类内的start方法
*/
myThread1.start();
// 把遵从Runnable接口的自定义线程类对象作为Thread类构造方法的参数
Thread thread = new Thread(new MyThread2());
thread.start();
for (int i = 0; i < 100; i++) {
System.out.println("main线程!!!");
}
}
}
1.6 线程操作中的常用方法
构造方法 Constructor
Thread();
创建一个线程类对象,并且线程对应的名字是系统提供的默认名字
Thread(Runnable target);
创建一个线程类对象,使用Runnable接口的实现类对象,作为线程执行的核心代码
Thread(Runnable target, String name);
创建一个线程类对象,使用Runnable接口的实现类对象,作为线程执行的核心代码,并且名字按照提
供的name来赋值操作
成员方法 Method
void setName(String name);
设置线程的名字
String getName();
获取当前线程的名字
void setPriority(int priority);
设置线程的优先级,优先级范围 1 ~ 10 1 最低, 10 最高,5 默认。优先级决定当前线程的执行概
率,不能确定一定执行
int getPriority();
获取当前线程的优先级
static Thread currentThread();
当前方法在哪一个线程中执行,就获取对应的线程对象
static void sleep(int ms);
让当前程序休眠指定的毫秒数 1000 ==> 1 sec
类方法能不能使用类内的成员变量
可以使用类内的静态成员变量,但是不能直接使用类内的非静态成员变量!!!
打印展示Thread类对象,展示内容:
Thread[Thread-0,5,main]
ThreadName, ThreadPriority, ThreadGroup
1.7 同步代码块【重点】
在线程操作中,存在大量的线程抢占共享资源问题,需要通过同步代码块来完成对于共享资源的操作限制。
synchronized (锁对象) {
}
锁对象:
1. 首先是一个类对象,不能是基本数据类型!!!
2. 锁对象有唯一性,同一个线程类对象的不同线程,操作同一个代码块时,锁对象必须一致
3. 同步代码块越短越好,需要提高执行的效率
4. 同步代码块中有且只允许一个线程在代码块中运行
5. 线程调用sleep方法不会开启锁对象!!!