并发和并行
-
并发是cpu单核处理同时处理多个任务。但是由于cpu处理速度很快,看着像是同时处理。
-
并行多核处理同时处理多个任务。
(图片来自韩顺平老师java基础教程)
进程和线程区别
当我们启动一个写好的程序(QQ),就相当于启动了一个进程。也就是说进程是运行中的程序。
线程是程序中的一个实例。比如我们启动完QQ,可以打开多个聊天页面。这些聊天页面就相当于线程。
线程的创建
1.继承Thread
new Cat().start()
Class Cat extend Thread{
重写run()方法
}
- 实现Runnable接口
Cat cat =new Cat ();
Thread thread=new Thread(cat);
thread.start()
Class Cat implement Runnable{
重写run()方法
}
两种方法的本质都是调用Thread中的start()方法来启动线程,然后线程会运行run()方法。
线程插队
- 线程插队的两个方法yield、join
thread1.yield() 礼让给线程thread1先执行,让出cpu空间,但可能礼让不成功,并且礼让的时间不确定 - thread1.join() 让线程thread1插队,执行完线程thread1,再来执行本线程其他内容
通知线程退出
可以通过设置线程loop为false,从而使线程退出while 循环,执行完线程全部并退出。类似的这种方式叫做通知线程退出
守护线程
当其他所有的线程结束时,守护线程就会结束。
把一个线程设置成守护线程的方法
thread01.setDaemon(true);
线程同步
- 线程同步代码块
非静态代码块的线程同步
synchronized (this){
//this 是一把互斥锁。this可以替换成其他的同一对象的东西。
//对于要实现同步的多线程,当线程运行到这个地方。由于锁只有一把,一旦有个线程抢到这把锁,就能进入代码块进行执行,其他的线程就等等他执行。
//当该线程执行完毕后,把锁释放。大家重新再抢这把锁,谁抢到谁就能进入代码块。
//互斥锁实现了某段代码块即使在多线程的情况下能控制只有一个线程能执行该代码块
}
静态代码块的线程同步
synchronized (类名){
}
- 线程方法
public synchronized static void say01(){
}
public synchronized void say02(){
}
线程死锁
各个线程持有锁的资源且无法释放,导致其他线程且持有锁资源的线程无法继续执行称作线程死锁
释放锁
(以上图片全出自韩曙平老师的java基础教学)