多线程:
1.进程的概念
|-- 就是一个应用程序,在内存中的所占区域
2. 线程的概念: 程序的多条执行路径。
|-- 就是进程中的一条执行路径,看做是进程中的小子程序
|-- 提高的程序的运行效率,可以保证多个线程一起运行
注意:虚拟机一定为多线程程序
3.Thread类中的常用方法。
run负责线程中运行的代码
Thread(String name),构造的时候,传递线程名
getName()获取线程名
setName()设置线程名
Thread.currentThread().getName()获取线程名,在非Thread子类中使用
start()开启线程,JVM调用线程的run方法
getpriority()获取线程优先级。
setpriority()设置线程的优先级。
join()加入线程
setDaemon()守护线程
yield()暂停线程
4. 创建线程的方法:
A第一种:
|-- 继承Thread类
|-- 覆盖掉run方法
|-- 建立Thread子类对象
|-- 调用start方法
B第二种:
|-- 实现Runnable接口,覆盖run方法
|-- 建立Thread类对象,传递实现Runnable接口的子类对象
|-- 调用Thread类中的run方法
|-- 第二种方式,可以实现对象中的数据共享
|-- 避免的单继承的局限性
5. 线程的随机性
|-- CPU控制线程的执行
|-- CPU进行线程中的切换,随机性,我们控制不了
6. 线程的五种运行状态:
a.创建线程
b.就绪
c.运行
d.冻结(阻塞)
e.消亡
7. 线程安全问题的产生:
A:有共享数据
B:多条语句操作共享数据代码
C:多个线程操作共享数据。
8:解决线程安全问题:
A:同步代码块(synchrozied)
当方法为非静态时:
synchronized(this)
{
}
当方法为静态时:
synchronized(类名.class)
{
}
B:同步函数
1.判断同步函数使用的锁
函数需要被对象调用,那么函数都有一个所属对象引用,就是this,所以同步函数使用的锁都是this.
2.静态方法的同步方法:
使用的锁是该方法所在火砖的字节码文件对象。类名.class
3.注意问题:这些线程是不是持有同一把锁
9. 死锁:当同步嵌套进,会出现死锁的状态。
10. 安全高效的懒汉式(面试常问)
class SingDemo{
private SingDemo{}
private static SingDemo sd=null;
static void SingDemo getSing(){
if(sd=null){
synchronized(SingDemo.class){
if(sd==null){
try{
Thread.sleep(50);
}catch(Exception e){
sd=new SingDemo();
}
}return sd;
}
}
return sd;
}
11.多线程间的通信:多个线程操作同资源,但操作的动作不同。即不同种的线程操作同一资源。
1.进程的概念
|-- 就是一个应用程序,在内存中的所占区域
2. 线程的概念: 程序的多条执行路径。
|-- 就是进程中的一条执行路径,看做是进程中的小子程序
|-- 提高的程序的运行效率,可以保证多个线程一起运行
注意:虚拟机一定为多线程程序
3.Thread类中的常用方法。
run负责线程中运行的代码
Thread(String name),构造的时候,传递线程名
getName()获取线程名
setName()设置线程名
Thread.currentThread().getName()获取线程名,在非Thread子类中使用
start()开启线程,JVM调用线程的run方法
getpriority()获取线程优先级。
setpriority()设置线程的优先级。
join()加入线程
setDaemon()守护线程
yield()暂停线程
4. 创建线程的方法:
A第一种:
|-- 继承Thread类
|-- 覆盖掉run方法
|-- 建立Thread子类对象
|-- 调用start方法
B第二种:
|-- 实现Runnable接口,覆盖run方法
|-- 建立Thread类对象,传递实现Runnable接口的子类对象
|-- 调用Thread类中的run方法
|-- 第二种方式,可以实现对象中的数据共享
|-- 避免的单继承的局限性
5. 线程的随机性
|-- CPU控制线程的执行
|-- CPU进行线程中的切换,随机性,我们控制不了
6. 线程的五种运行状态:
a.创建线程
b.就绪
c.运行
d.冻结(阻塞)
e.消亡
7. 线程安全问题的产生:
A:有共享数据
B:多条语句操作共享数据代码
C:多个线程操作共享数据。
8:解决线程安全问题:
A:同步代码块(synchrozied)
当方法为非静态时:
synchronized(this)
{
}
当方法为静态时:
synchronized(类名.class)
{
}
B:同步函数
1.判断同步函数使用的锁
函数需要被对象调用,那么函数都有一个所属对象引用,就是this,所以同步函数使用的锁都是this.
2.静态方法的同步方法:
使用的锁是该方法所在火砖的字节码文件对象。类名.class
3.注意问题:这些线程是不是持有同一把锁
9. 死锁:当同步嵌套进,会出现死锁的状态。
10. 安全高效的懒汉式(面试常问)
class SingDemo{
private SingDemo{}
private static SingDemo sd=null;
static void SingDemo getSing(){
if(sd=null){
synchronized(SingDemo.class){
if(sd==null){
try{
Thread.sleep(50);
}catch(Exception e){
sd=new SingDemo();
}
}return sd;
}
}
return sd;
}
11.多线程间的通信:多个线程操作同资源,但操作的动作不同。即不同种的线程操作同一资源。