1,并发 / 并行:在同一时刻,有多个指令在单 / 多个CPU上交替 / 同时执行
2,进程:
①独立性:进程是一个能独立运行的基本单位,同时也是系统分配资源和调度的独立单位。
②动态性:进程的实质是程序的依次执行过程,进程是动态产生,动态消亡的。
③并发性:任何进程都可以同其它进程一起并发执行。
3,线程:是进程中的单个顺序控制流,是一条执行路径
4,单线程 / 多线程:一个进程如果只有一条 / 多条执行路径,则称为单线程 / 多线程程序。
5,进程就是操作系统中正在运行的一个应用程序
6,线程就是应用程序中做的事情
7,多线程的三种实现方案:
- 继承Thread类的方式进行实现
- 实现Runnable接口的方式进行实现
- 利用Callable和Future接口方式实现
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
public class MyCallable implements Callable<String> {
@Override
public String call() throws Exception {
for (int i = 0; i < 100; i++) {
System.out.println("测试" + i);
}
//返回值就表示线程运行完毕之后的结果,泛型,返回值类型也得统一
return "测试2";
}
}
class Test {
public static void main(String[] args) {
//线程开启之后需要执行里面的call方法
MyCallable myCallable = new MyCallable();
//可以获取线程执行完毕之后的结果,也可以作为参数传递给thread对象,,FutureTask的泛型得和Callable的泛型一致
FutureTask<String> futureTask = new FutureTask<String>(myCallable);
//创建线程对象
Thread thread = new Thread(futureTask);
//开启线程
thread.start();
String s = null;
try {
s = futureTask.get();//get方法得在start方法之后
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
System.out.println(s);
}
}
8,线程的两种调度模型:
- 分时调度模型:所有线程轮流使用CPU的使用权,平均分配每个线程占用CPU的时间片
- 抢占式调度模型:优先让优先级高的线程使用CPU,如果线程的优先级相同,那么会随机选择一个,优先级高的线程获取的CPU时间片相对多一些(Java使用的是抢占式调度模型)
9,守护线程
当普通线程执行完之后,那么守护线程也没有继续运行下去的必要了,但并不会立马停止
10,同步代码块
锁多条语句操作共享数据,可以使用同步代码块实现
- 格式:
synchronized(任意对象,但锁的对象一定要是唯一的){
多条语句操作共享数据的代码 }
- 默认情况是打开的,只要有一个线程进去执行代码了,锁就会关闭
- 当线程执行完出来了,锁才会自动打开
同步代码块的好处与弊端
- 好处:解决了多个线程同时操作共享数据
- 弊端:当线程很多时,因为每个线程都会去判断同步上的锁,这是很耗费资源的,会降低程序的运行效率
11,同步方法
把synchronized关键字加到方法上
- 格式:修饰符 synchronized 返回值类型 方法名(方法参数){ }
同步代码块和同步方法的区别:
- 同步代码块可以锁住指定代码,同步方法是锁住方法中所有代码
- 同步代码块可以指定锁对象,同步方法不能指定锁对象
同步方法的锁对象是:this
同步静态方法的锁对象是:类名.class(当前类的字节码文件对象)