多线程
一,多线程
1,并发与并行
并行:两个或两个以上的事件,同一时刻发生(同时进行)
并发:两个或两个以上的事件,同一时间段内发生(交替进行)
2,进程与线程
进程:进入到内存中的应用程序、软件,这个过程叫做进程。
线程:进程中的一个执行单元,负责当前进程中程序的执行,一个进程中至少有一个线程,一个程序是可以有多个线程的,这个程序就可以称作多线程。
3,主线程
主线程:执行main方法的线程。
单线程:程序执行从main方法开始,从上到下执行。
原理:java程序进入内存,jvm先执行main方法,jvm会找操作系统开辟main方法---》通向CPU的路径,CPU就会通过这个路径main执行代码
4,创建线程类
概述:
java.lang.Thread 类代表线程,所有的线程对象都必须是Thread的类或是其子类。
创建步骤:
1,继承Thread类
2,重写run(); 方法
3,创建Thread子类的实例,即使创建了线程对象
4,调用 对象.start();方法
获取线程名:
1,Thread类中,有getName(); 返回该线程名称 String name
2,获取当前正在执行的线程名称 currentThread();返回当前正在执行的线程对象,再通过 对象.getName(); 获取名称
设置线程名:
1,通过父类构造器,把名字String name传参到其中,super(name);
2,通过 对象.set(name);方法
休眠:
sleep(long seconds); 执行的是线程休眠
5,实现类接口方式创建线程
概述:
java.lang.Runnable 接口可通过被实现类实现方式,创建线程
步骤:
1,创建实现类实现Runnable接口
2,重写run();方法----》方法中是新线程执行的代码
3,创建Runnable实现类的对象
4,创建Thread类对象,构造器中传参(Runnable实现类 对象)
5,调用Thread类对象.start();方法,开启新的线程,执行run();
作用:
1,一个类如果继承Thread类,就不能继承其他类了
2,一个类实现Runnable接口还可以继续继承其他类,提高可重用性
二,线程安全
概述:
如果有多个线程同时运行,而这些线程同时运行这段这段代码,如果程序运行的结果和单线程结果一样,而且运行的结果和预期效果也是一样的,我们成线程安全。否则,线程存在安全问题。
当我们使用多个线程访问同一个源,并且多个线程中对资源有写的操作,就容易出现线程安全问题。
解决:
java中提供了同步来解决线程安全问题。 synchronized
使用:
1,同步代码块
synchronized(锁对象){
出现安全问题代码块
}
步骤:
1》在成员位置创建 锁对象
2》把锁对象添加到()中
3》问题代码块添加到{ }中
注意:
1,创建的锁对象可以是任意对象,Object obj =new Object();
2,必须保证多个线程使用的是同一个锁对象
3,把{ }只让一个线程进
2,同步方法
步骤:
1》创建一个方法,修饰符添加 synchronized
2》把访问了共享数据的代码块放入该方法中
3》调用方法
3,Lock锁
概述:
Lock接口中,有lock();上锁 unlock();解锁的方法
步骤:
1》在成员位置创建Lock的实现类, ReentrantLock
2》在可能会出现问题的代码前面, 调用 lock();方法加锁
3》在可能会出现问题的代码后面,调用 unlock();方法解锁,释放锁
三,线程状态
API中,java.lang.Thread.State 帮助手册
概述:
当线程被new 创建后,不是立即执行的,线程存在多种状态
New 线程新建状态,但未被启动
Runnable 可运行,在JVM里的状态
Blocked 阻塞
Waiting 无限等待,一个线程在等待另一个线程唤醒
Timed_Waiting 计时等待
Terminated 被终止,因run();结束,正常退出而死亡