Java中的多线程 实现多线程的方式: 方法: 同步: Lock: 线程安全的类 PV操作:
继承Thread:
1:先有一个类 继承 Thread类
2:重写 Thread 类里面 run方法, 把你要让新线程 做的任务 写在 run方法里面
3:在测试类中 创建这个类的对象
4:不是调用run方法, 而是要调用start方法, 线程就开启了。
方法:
设置线程的名字:通过Thread的构造方法,Thread类里面的setName()方法
获取线程的名字:getName()
获取当前线程Thread.currentThread()
线程的优先级getPriority()
void join();插队,优先执行
守卫线程void setDaemon(boolean b); 主线程结束,JVM关闭,守卫线程结束。
Runnable:
1:先有一个类 ,实现 Runnable 接口
2:重写 Runnable 类里面 run方法, 把你要让新线程 做的任务 写在 run方法里面
3:创建这个类的对象
4:创建Thread对象 并Runnable的子类对象 作为 Thread类的 构造方法的参数传递进去
5:让Thread的对象 调用start方法
第二种方式符合高内聚低耦合的设计思想。实现了线程与线程任务的分离。
同步:
非静态方法同步:
非静态同步代码块(不用写那个对象了,默认带this):
可以转换为非静态同步方法:
静态同步方法:
总结:
非静态的同步方法的锁对象 是this
静态的同步方法的锁对象 是 当前方法所在的类的 class 文件对象,
class Student {
public void show(){
synchronized(this){
//n行代码 1
}
}
public synchronized void show(){
//n行代码 1
}
public static void method(){
synchronized(Student.class){
//n行代码 2
}
}
public static synchronized void method(){
//n行代码 2
}
}
Lock:
线程安全的类
Map :
Hashtable : jdk1.0的时候出现的。 效率低。 就是因为他线程安全的。
Properties
HashMap 代替 Hashtable
ArrayList 代替 Vector
StringBuilder 代替 StringBuffer
Collections里面有方法可以生成一个线程安全的list,set,map。
PV操作:
实现方法——wait(),notify(),notifyAll():
它们都继承自Object,必须在同步代码块里调用,并且必须使用锁对象调用,锁对象不能是任意对象。
wait():
当前线程暂停(放弃占用CPU进入等待状态)直到另一个线程调用该对象的notify()或者notifyAll()方法。
notify():
唤醒线程队列里随机的一个线程
notifyAll():
唤醒线程队队列里全部线程
经典的单缓冲区生产者消费者问题:
奶箱类:
this.wait()的含义是:
state为true表示有奶则线程producer进入put()方法并且将producer线程停下来(this.wait()),
等待一个customer线程get()到奶并且调用notify()或者notifyAll(),把在put()方法里的producer线程唤醒,
producer就可以生产奶了。