线程
1:什么是线程
线程是app中的一个任务(顺序执行流)
进程是操作系统的一个任务,开辟了一个独立的内存空间,一个app占用一个进程,一个app中有一个或多个线程。这些线程可以共享这块内存空间的资源。
2:并发
在计算机中,围观上,多个线程不是同时进行的,而是断断续续的(cpu把时间段分成无数多个小的时间片段,而在一个时间片段中,cpu只能运行一个线程,其他线程处于阻塞状态),而宏观上,看上去像是“同时发生”的,这种情况叫并发。
并发的优点:提高运行效率
缺点:有安全隐患
3:线程的状态
new
|
|-start()
|
runnable
|
wait sleep |
running
|
over
4:线程的创建
(1)继承Thread类,重写run方法(run方法的作用就是写任务代码)
(2)实现Runnable接口,重写run方法。还要把Runnable的子类型传入Thread对象中,由Thread对象负责启动线程。
(3)使用匿名内部类完成线程的创建
5:main方法,是jvm调用的执行程序的入口,也是一个线程。
6:线程的常用API
(1)getName();获取线程的名称(系统会给每一个线程默认分配个名称)
(2)getId();获取线程的ID值(系统会给每一个线程分配一个标识符)
(3)currentThread();是静态方法,获取当前所处的线程
(4)sleep(long time);静态方法,使当前线程进入阻塞状态多少毫秒(让出时间片段),超出time时间,自动进入runnable状态,在time时间内,可能会被打断,会出现打断异常。
(5)interrupt();打断线程(谁调用,谁就会被打断)线程只有处在睡眠状态时,才会被打断。
(6)yield();使线程回到runnable状态,让出当前的时间片段。
(7)join();线程同步
7:线程安全问题
当多个线程同时访问某一处资源时,会发生线程安全问题。
这类资源可以是(1)静态资源(2)实例属性
我们应该让多个线程异步访问这个资源变成同步访问这个资源。
异步:多个线程“同时运行”,自己干自己的。
同步:多个线程要按照顺序,一个访问完,另一个才能访问。
锁机制:关键字synchronized(同步),java语言可以为某一块代码提供一个内置锁。
格式:synchronized(锁对象){
代码块
}
当某一个线程执行到此代码时,会获取一个内置锁,将此代码从里面上锁,其他线程碰到此代码时,需要等待正在运行的线程运行完这个代码块后(会释放内置锁),才可以获取内置锁对象。
锁:java的任何对象都可以作为锁对象,但是必须保证多个线程使用的是同一个锁,如果锁不是同一个,那么解决不了线程安全问题。
可以对方法进行直接加锁机制,有锁,锁是类对象(获取类对象的方法:类名.class,类对象是唯一的)。
在使用锁机制时,要主要效率,锁入的代码越少效率越高。
静态方法和动态方法在使用锁机制时,不互斥(不会影响)。
静态方法的锁对象时类对象。
动态方法的锁是对象。
8:wait()/notify():作用是协调多线程的工作。
举例说明:一个线程的运行可以会跟另外一个线程有关系,关系如:线程A要等线程B运行完才可以运行。线程A中要使用锁对象.wait()表示等待(让出cpu片段),线程B运行完时,需要锁对象.notify()通知线程A,可以运行了。