线程相关的Demo
一:多线程的两种方式
1.线程与进程
进程是一个执行的程序
线程则是属于进程的一个控制单元。
2.多线程的第一种方式
继承Thewad类。
run的作用:多线程存储程序的地方
start的作用:开启线程,同时,调用run方法。
3.第一种方式的线程程序
4.第二种方式,实现接口
.
5.两种方式的比较
第二种方式:避免了单继承的局限性。
两种方式的线程代码存放位置不同:
继承Thread的线程代码放在Thread的子类run的方法中。
实现Runnable,线程代码存在接口的子类的run方法中。
二:多线程的安全问题
6.同步代码块
7.同步函数
使用的锁是this。
8. 使用同步函数实现卖票程序
需要把要同步的代码另外移植到一个函数中,因为,直接在函数上同步上,while不会跳出来,就是说一个线程一直运行到底。
9.静态同步函数的锁
静态进入内存后,内存没有本类对象,但是一定该类对应的字节码文件对象
类名.class。
10.懒汉式单例模式下的线程安全
11.死锁程序
两个锁互相锁。
三:通讯
12.单线程间通讯
13.单线程间通讯的优化
一些方法可以放在Resource中。
14.多线程间多通讯
多生产者消费者问题中(既该案例),一开始对用while还是if概念比较模糊,经过分析后总结如下: while进入一个线程之后执行wait(100),立刻释放锁,接着其它线程执行set或者out,如果执行了out,那么当前线程则会跳出循环(out会将flag改为false跳出循环),执行后续代码。 if 进入一个线程之后执行wait(100),立刻释放锁,接着其它线程执行set或者out,如果执行了out,那么等当前线程(假设为A)wait之后的下一个线程进入set再经过判断才能执行后面的代码。 如果当时wait的线程(A线程)再次被启动会接着当时的代码继续执行,这样导致生产者会生产多次数据在消费者还未消费的情况下。
15.同步的lock锁的使用
16.守护进程
主进程结束后,其他前程也跟着结束
17.停止进程
18.join方法。