一:首先我去想去弄明白为什么要用多线程?
因为多线程能提高执行效率,尽可能的利用程序资源,而多进程是尽可能的利用CPU的资源,并且能增强用户体验。
二:那其次要知道如何利用多线程?创建多线程主要有两种方法:
第一种创建多线程方法:
①:创建一个线程类继承Thread类,并重写Thread类中的run方法,在run方法中编写多线程执行体。
②:在测试类中,实例化线程类,可以实例化多个线程类。
③:通过start()方法启动线程,默认执行run方法。
第二种创建多线程方法:
①:创建一个线程类实现runable接口,并在该线程类中重写run()方法,run中编写线程执行体。
②:实例化上面的线程类,并额外再创建一个Thread实例,如Thread t1 = new Thread("上一个线程类的对象引用放到这");
③:调用 Thread 类的 start() 方法启动线程,默认执行 run() 方法。
三:会创建多线程了,那多线程都有哪些常用方法?
currentThread() : 获取当前线程
getName() : 获取线程名称
setName() : 设置线程名称
start() : 启动线程
sleep(long millis) : 是一个静态方法,使当前线程进入睡眠状态
join() / join(long millis) : 是一个实例方法,使当前线程进入阻塞状态
interrupt() : 中断阻塞状态的线程
isAlive() : 判断当前线程是否处于存活状态
yield() : 线程让步
四:线程的生命周期是什么?这点很重要,利用一个图来解释
五:虽然可以利用多线程了,但是这样利用多线程还存在一定的弊端,就是不安全问题。所以这时就可以利用线程同步机制了。
线程同步的核心思想:将多个线程需要访问的共享数据,包装起来,视为一个整体,确保一次只有一个线程执行流访问共享数据;
线程同步方式主要有三种形式:
①:synchronized (同步监视器){
同步代码块
}
同步监视器 : 俗称“锁”,可以使用任意对象充当,必须确保多个线程持有同一把锁(同一个对象)
②:public synchronized void show(){
隐式的锁: this
}
③:同步锁
lock();//上锁
unlock();//解锁
6:终止线程的操作
stop()和suspend()方法来终止线程的执行,当用Thread.stop()来终止线程,会释放已经锁定的所有监视资源,如果当前任何一个受这些监视保护的对象处于一个不一致的状态,调用suspend容易发生死锁现象,suspend()不会释放锁,如果用一个suspend挂起一个有锁的线程,那么锁恢复之前将不会被释放。