小新学Java12-【线程、同步】
一、线程
1.多线程原理
①随机性打印结果

②多程序内存图解

2.Thread
Thread类常用方法:
①获取线程名称的方法
获取线程的名称:
1)使用Thread类中的方法getName( )
string getName()返回该线程的名称。
2)可以先获取到当前正在执行的线程,使用线程中的方法getName()获取线程的名称
static Thread CurrentThread()返回对当前正在执行的线程对象的引用。
设置线程的名称:(了解)
1.使用Thread类中的方法setName(名字)
void setName ( String name)改变线程名称,使之与参数name相同。
2.创建一个带参数的构造方法,参数传递线程的名称;调用父类的带参构造方法,把线程名称传递给父类,让父类(Thread)给子线程起一个名字
Thread ( string name)分配新的Thread 对象。
3.创建线程方式(二)
创建多线程程序的第二种方式:实现Runnable接口
java.Lang.Runnable
Runnable 接口应该由那些打算通过某一线程执行其实例的类来实现。类必须定义一个称为 run的无参数方法。
java.Lang.Thread类的构造方法
Thread ( Runnable target)分配新的Thread 对象。
Thread ( Runnable target,string name)分配新的Thread 对象。
实现步骤:
1.创建一个Runnable接口的实现类
2.在实现类中重写Runnable接口的run方法,设置线程任务
3.创建一个Runnable接口的实现类对象
4.创建Thread类对象,构造方法中传递Runnable接口的实现类对象
5.调用Thread类中的start方法,开启新的线程执行run方法
4.Thread和Runnable的区别
如果一个类继承Thread,则不适合资源共享。但是如果实现了Runnable接口的话,则很容易的实现资源共享。
总结:
实现Runnable接口比继承Thread类所具有的优势:
1)适合多个相同的程序代码的线程去共享同一个资源。
2)可以避免java中的单继承的局限性。
3)增加程序的健壮性,实现解耦操作,代码可以被多个线程共享,代码和线程独立。
4)线程池只能放入实现Runable或Callable类线程,不能直接放入继承Thread的类。
扩充∶在java中,每次程序运行至少启动2个线程。一个是main线程,一个是垃圾收集线程。因为每当使用java命令执行一个类的时候,实际上都会启动一个JVM,每一个JVM其实在就是在操作系统中启动了一个进程。
5.匿名内部类方式实现线程的创建
匿名内部类方式实现线程的创建
匿名:没有名字
内部类:写在其他类内部的类
匿名内部类作用:简化代码
把子类继承父类,重写父类的方法,创建子类对象合一步完成
把实现类实现类接口,重写接口中的方法,创建实现类对象合成一步完成
匿名内部类的最终产物:子类/实现类对象,而这个类没有名字
格式:
new父类/接口(){
重复父类/接口中的方法
};
二、线程安全
1.线程安全
多线程访问共享的数据,会产生线程安全问题。
实例:


2.线程同步
为了保证每个线程都能正常执行原子操作Java引入了线程同步机制。那么怎么去使用呢?有三种方式完成同步操作︰
①同步代码块。
②同步方法。
③锁机制。
3.同步代码块
解决线程安全问题的一种方案:使用同步代码块
格式:
synchronized(锁对象){
可能会出现线程安全问题的代码(访问了共享数据的代码)
}
注意:
1.通过代码块中的锁对象,可以使用任意的对象
2.但是必须保证多个线程使用的锁对象是同一个
3.锁对象作用:
把同步代码块锁住,只让一个线程在同步代码块中执行
4.同步方法
5.Lock锁
三、线程状态
1.线程状态概述

2.Time Waiting(计时等待)

3.BLOCKED(锁闭塞)

4.Waitting(无限等待)

5.补充知识点


浙公网安备 33010602011771号