1.线程基本概念
进程:
进程是指运行中的程序,每启动一个进程,操作系统就会为它分配内存,是程序的一次执行过程
线程:
线程是进程的最小单位,每一个进程有多个线程
并发:
同一时刻,多个任务交替执行,造成一种”同时进行“的感觉,简单来说,单核cpu实现的多任务就是并发
并行:
同一个时刻,多个任务同时执行,多核cpu即可实现
2.java中线程的实现方法
1、继承Thread类
class MyThread extends Thread {
@Override
public void run() {
super.run();
}
}
继承Thread类,重写run()方法
2、实现Runnable接口
class MyThread implements Runnable {
@Override
public void run() {
super.run();
}
}
实现Runnable接口,重写run()方法
注意:
1)创建线程后,一定要调用线程的start()方法,才会执行新的线程
2)执行run()方法,只会在main线程执行普通的方法,并没有开启新的线程
3)start()方法是里面有一个start0()是一个本地方法,底层由C、C++实现,由JVM调用,真正实现多线程的效果是start0()方法,而不是run()方法
4)start()方法调用start0()方法后,该线程并不一定立即执行,只是将该线程变为了可执行状态,具体什么时候执行,由cpu统一调度
3.线程常用方法
1、setName(): 设置线程名称
2、getName(): 取得线程名称
3、start(): 线程执行
4、run():线程执行逻辑
5、setPriorty/getPriority:
6、sleep(): 休眠
7、interrup():中断线程
4.线程的礼让
1、yield()方法:线程让出cpu、让其他线程执行,但礼让的时间不确定,也不一定成功
2、join()方法:线程的插队。插队的线程一旦插队成功,则肯定先执行完插入的线程的所有任务
5.守护线程
1、一般为工作线程服务,当所有的用户线程结束、守护线程自动退出
2、常见的守护线程:垃圾回收机制
3、setDaemon(true):设置守护线程
6.线程的同步
1、线程同步,即当有一个线程在对内存进行操作时,其他线程都不可以对这个内存地址进行操作,直到该线程完成操作,其他线程才能对该内存地址进行操作
2、关键字Synchronized
同步代码块
synchronized(对象) {
//需要同步的代码块
}
同步方法
public synchronized void m(String name) {
//需要同步的代码
}
3、同步的局限性:导致程序的执行效率降低
4、同步方法(非静态的)的锁可以是this,也可以是其他对象,默认为this
5、同步方法(静态的)的锁是类本身
7.释放锁的案例
1、同步代码块执行完
2、遇到break,return等语句
3、遇到未处理的Error、Exception导致异常终止
4、wait()方法会释放锁
5、线程的Thread.sleep()方法、Thread.yield()方法会暂停当前线程的执行,但不会释放锁