线程与进程
进程
- 指内存中的一段应用程序,每个进程都有一段独立的运行空间
线程
- 是进程中的一个执行路径,共享一段内存空间,线程之间可以自由切换,并发执行。一个进程至少有一个线程
- 线程是进程的进一步划分,一个进程启动后,里面的若干个执行路径可以划分为多个线程
线程调度
分时调度
- 所有线程轮流使用 CPU 的使用权,平均分配每个线程占用 CPU 的时间。
抢占式调度
- 优先让优先级高的线程使用 CPU,如果线程的优先级相同,那么会随机选择一个(线程随机性),
CPU在多个线程中高速切换,对于一个核心来说,某个时刻只能执行一个线程,由于速度切换的非常快,感觉是在同时执行,多线程不能提高速度,但能提高效率,让CPU利用率更高
同步与异步
同步为排队执行,效率低但安全
异步同时执行,效率高但不安全
并行与并发
并发 指两个或多个事件在同一个时间段发生的
并行 指两个或多个事件在同一时刻发生(同时发生)
Java中多线程的使用方法
- 继承Thread类
class MyThread extends Thread{
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName()+i);
}
}
}
public class demo {
public static void main(String[] args) {
MyThread thread = new MyThread();
thread.start();
for (int i = 0; i <10 ; i++) {
System.out.println(Thread.currentThread().getName()+i);
}
}
}
- 实现Runnable方法
class Myrunnable implements Runnable{
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName()+i);
}
}
}
public class demo {
public static void main(String[] args) {
Myrunnable r= new Myrunnable();
new Thread(r).start();
for (int i = 0; i <10 ; i++) {
System.out.println(i);
}
}
}
线程阻塞
使用interrupt()方法出发线程的InterruptException的异常处理模块。
守护线程
守护用户线程的
当最后一个用户线程结束,所有守护线程死亡
t.setDaemon(true)
线程安全问题
多个线程操作同一段代码致使变量出错的问题
解决方法
- 同步代码块
Synchronized (锁对象){
}
锁对象可以是任何对象,打标记。
- 同步方法
synchronized method(){
}
- 显示锁(Lock)
首先创建锁
Lock lock = new ReentrantLock();
lock.lock()
{
}
lock.unlock()
注意事项,注意是否是同一把锁
公平锁和非公平锁
公平锁先来先到,线程排队
非公平锁大家一起抢
Lock lock = new ReentrantLock(true);
死锁问题
两个线程各拿着对方需要执行的代码块的锁,导致程序卡死问题
解决方法,在加锁的代码中,不要再调用其他加锁的代码
生产者与消费者问题
保证多线程之间的通信顺序问题
设置flag标志位
线程的六种状态
NEW RUNNABLE BLOCKED WAITING TIMED WAITING TERMINATED
Callable
class XXX implements Callable<T> {
@Override
public <T> call() throws Exception {
return T;
}
}
FutureTask<Integer> future = new FutureTask<>(callable);
new Thread(future).start();
线程池
- 降低资源消耗
- 提高相应速度
- 提高线程的可管理性
缓存线程池
定长线程池
单线程线程池
周期性任务定长线程池
Lambda表达式
JDK8版本引入
函数式编程
(参数)->{类方法}