2017-07-27
- 多线程一般两个方式,继承Thread类或者实现Runnable接口,最终都是要调用Thread的start()方法
- main方法开启主线程,后台还有jvm用于回收垃圾的后台线程。
- 线程有好几个状态,Runnable,Running,Block。每个Runnable线程都有资格争抢CPU执行权。
- Runnable表示有执行的资格等待被调度,当获取CPU执行权后,即可编程Running
- Block即为阻塞状态,此时该线程是没有执行资格的,一般是调用了join(),sleep(),wait(),或者被同步锁挡住(synchronized)。
- 当操作共享数据的时候,多线程就会造成错误,比如多窗口卖票,可能出现负数。此时需要同步代码块或者同步函数来解决。
- 静态同步函数的锁是class文件,因为静态方法执行的时候还没创建对象。
import java.lang.Thread;
import java.lang.Runnable;
class ThreadDemo3 implements Runnable{
private int ticket = 100;
private boolean flag;
public void run () {
if (flag) {
while(true) {
synchronized (this) {
if (ticket > 0 ) {
System.out.println(Thread.currentThread().getName() + "......" + ticket--);
}
}
}
} else {
while (true) {
show();
}
}
}
public synchronized void show() {
if (ticket > 0 ) {
System.out.println(Thread.currentThread().getName() + "......" + ticket--);
}
}
public static void main(String[] args) {
ThreadDemo3 td = new ThreadDemo3();
Thread t1 = new Thread(td);
Thread t2 = new Thread(td);
t1.start();
td.flag = false;
t2.start();
}
}