目录
多线程
线程:
进程:
并发:
并行:
多线程的实现方式:
Thread类
Runnable接口
Callable接口和Future接口
成员方法
线程的生命周期
线程的安全问题
前言:学习JAVA的第二十天(基础)-CSDN博客
多线程
线程:
线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。
进程:
程序的基本执行实体
并发:
在同一时刻,有多个指令在单个CPU上交替执行
并行:
在同一时刻,有多个指令在多个CPU上同时执行
多线程的实现方式:
- 继承Thread类的方式进行实现
- 实现Runnable接口的方式进行实现
- 利用Callable接口和Future接口方式实现
Thread类
public static void main(String[] args) {
//1.定义类继承Thread类
//2.重写run方法
//3.创建子类的对象,并启动线程
//创建MyThread对象
MyThread t1 = new MyThread();
MyThread t2 = new MyThread();
//取名字,方便等会运行看结果
t1.setName("线程1");
t2.setName("线程2");
//开启线程
t1.start();
t2.start();
}
Runnable接口
public static void main(String[] args) {
//1.定义一个类实现Runnable接口
//2.重写run方法
//3.创建自己类的对象
//4.创建Thread类的对象,并启动线程
//创建自己类的对象
MyRun mr = new MyRun();
//创建Thread类的对象,并启动线程
Thread t1 = new Thread(mr);
Thread t2 = new Thread(mr);
//设置名字
t1.setName("线程1");
t2.setName("线程2");
//开启线程
t1.start();
t2.start();
}
Callable接口和Future接口
public static void main(String[] args) throws ExecutionException, InterruptedException {
//1.创建一个类MyCallable实现Callable接口
//2.重写call(有返回值)
//3.创建MyCallable的对象(表示要执行的任务)
//4.创建FutureTask的对象(管理多线程运行的结果)
//5.创建Thread的对象,并启动线程
//创建MyCallable对象
MyCallable mc = new MyCallable();
//创建FutureTask的对象
FutureTask<Integer> ft = new FutureTask<>(mc);
//创建Thread的对象,并启动线程
Thread t1 = new Thread(ft);
t1.start();
//获取多线程的结果
System.out.println(ft.get());
}
成员方法
方法名 | 说明 |
---|---|
String getName() | 返回线程的名称 |
void setName(String name) | 设置线程的名字 |
static Thread currentThread() | 获取当前线程的对象 |
static void sleep(long time ) | 让线程指定的休息时间(单位毫秒) |
setPriority(int newPriority) | 设置线程的优先级 |
final int getPriority() | 获取线程的优先级 |
final void setDaemon(boolean on) | 设置为守护线程 |
public static void yield() | 出让线程 |
public static void join() | 插队线程 |
线程的生命周期
新建状态->就绪状态->运行状态(阻塞状态)->死亡状态
就绪状态:拥有执行的资格,没有执行权
运行状态:拥有执行的资格,也有执行权
阻塞状态:没有执行的资格,没有执行权
线程的安全问题
在我们使用多线程的时候,当线程遇到阻塞和就绪等状态时,会争夺CPU的执行权。
解决方式:同步代码块(把操作共享数据的代码锁起来)
//格式
synchronized(锁){
//操作数据共享的代码
}
特点:
锁默认打开,有一个线程进去了,锁自动关闭
里面的代码全部执行完毕,线程出来,锁自动打开
锁对象是唯一的
同步方法 :
就是把synchronized关键字加到方法上
格式:
修饰符 synchronized 返回值类型 方法名(方法参数){
}
特点:
同步方法是锁住方法里面所有的代码
锁对象不能自己指定(非静态:this 静态:当前类的字节码文件对象)