目录
进程
线程
实现多线程
设置和获取线程名称
线程调度
线程控制
同步代码块
同步方法
Lock锁
进程
进程是正在运行的程序,是系统进行资源分配和调用的独立单位,每一个进程都有它自己的内存空间和系统资源
线程
线程:是进程中的单个顺序控制流,是一条执行路径
单线程:一个程序如果只有一条执行路径,则称为单线程程序
多线程:一个程序如果有多条执行路径,则称为多线程程序
实现多线程
方式一:继承Thread
定义一个类MyThread继承Thread类
在MyThread类中重写run()方法
创建MyThread类的对象
启动线程
方式二:实现Runnable接口
定义一个类MyRunnable实现Runnable接口
在MyRunnable类中重写run()方法
创建MyRunnable类的对象
创建Thread类的对象,把MyRunnable对象作为构造方法的参数
启动线程
设置和获取线程名称
Thread类中设置和获取线程名称的方法
void setName(String name):将此线程的名称更改为等于参数name
String getName():返回此线程的名称
public class MyThreadDemo {
public static void main(String[] args) {
MyThread my1 = new MyThread("飞机");
MyThread my2 = new MyThread("高铁");
my1.start();
my2.start();
}
}
public class MyThread extends Thread{
public MyThread(){}
public MyThread(String name){
super(name);
}
@Override
public void run() {
for(int i = 0;i<10;i++){
System.out.println(getName()+":"+i);
}
}
}
线程调度
线程有两种调度模式
分时调度模式:所有线程轮流使用CPU的使用权,平均分配每个线程占用CPU时间片
抢占式调度模式:优先让优先级高的线程使用CPU,如果线程的优先级相同,那么会随机选择一个,优先级高的线程获取的CPU时间片相对多一些
Thread类中设置和获取线程优先级的方法
public final int getPriority():返回此线程的优先级
public final void setPriority(int newPriority):更改此线程的优先级
线程默认优先级是5,线程优先级的范围是:1-10
线程优先级高仅仅表示线程获取的CPU时间片的几率高,但是要是在次数比较多,或者多次运行的时候才能看到你想要的效果
线程控制
| 方法名 | 说明 |
| static void sleep(long millis) | 使当前正在执行的线程停留(暂停执行)指定的毫秒数 |
| void join() | 等待这个线程死亡 |
| void setDaemon(boolean on) | 将此线程标记为守护线程,当运行的线程都是守护线程时,Java虚拟机将退出 |
同步代码块
锁多条语句操作共享数据,可以使用同步代码块实现
格式:
synchronized(任意对象){
多条语句操作共享数据的代码
}
synchronized(任意对象):就相当于给代码加锁了,任意对象就可以看成一把锁
同步方法
就是把synchronized关键字加到方法上去
格式:修饰符 synchronized 返回值类型 方法名(方法参数){}
同步方法的锁对象是this
同步静态方法:就是把synchronized关键字加到静态方法上
格式:修饰符 static synchronized 返回值类型 方法名(方法参数){}
同步静态方法的锁对象是:类名.class
Lock锁
虽然我们可以理解同步代码块和同步方法的锁问题,但是我们并没有直接看到在哪里加上了锁,哪里释放了锁,为了更清晰的表达如何加锁和释放锁,java提供了一个新的锁对象Lock
Lock实现提供比使用synchronized方法和语句可以获得更广泛的锁定操作
Lock中提供了获得和释放锁的方法
void lock():获得锁
void unlock():释放锁
Lock是接口不能直接实例化,这里采用它的实现类ReentrantLock来实例化
ReentrantLock的构造方法:ReentrantLock():创建一个ReentrantLock的实例



