应用一:
售卖车票例子:售票的动作需要“同时进行”,因此使用多线程技术
//代码
package Thread;
class Tickets implements Runnable{
private int ticket=100;
public void run(){
while(ticket!=0) {//多线程里要有循环
if (ticket > 0) {
//使CPU在这里停一下,使用sleep()函数,Thread 中的静态函数。使其出现错误的数据
try{Thread.sleep(10);}catch (InterruptedException e){}//没有解决方案
System.out.println(Thread.currentThread() .getName() +" "+--ticket);
}
}
}
}
public class ThreadSellTickets {
public static void main(String[] args){
Tickets tc = new Tickets();
Thread T1 =new Thread(tc);
Thread T2 =new Thread(tc);
// Thread T3 =new Thread(tc);
//Thread T4 =new Thread(tc);
T1.start();
T2.start();
//T3.start();
//T4.start();
}
}
运行结果:
Thread-0 10
Thread-1 9
Thread-1 8
Thread-0 7
Thread-1 6
Thread-0 5
Thread-1 4
Thread-0 3
Thread-1 2
Thread-1 1
Thread-1 0
Thread-0 -1
由运行结果可得到此时会出现错误的数据:票的数量不会出现负数
出现这种错误的原因:
假设现在车票只剩一张,在一条路径中 if 判断进入执行,此时CPU切换到另一条路径,if 语句判断合理,
可以执行输出语句ci,得此时票数改变为零,此线程执行结束,再回到线程0直接从上次的状态开始执行,执行输出语句,此时输出的车票数就为-1,出现错误数据
相应的解决办法,为锁机制,先一个笔记具体写。
在这个问题的基础之上,还要提醒自己注意的几点
1.有一个关于线程的状态问题
1.创建线程对象,
2.运行 start 开启线程调用run 方法
具有CPU的执行资格
具有CPU的执行权
3.当run 线程任务执行完后,路径结束(在栈中的这片空间释放)
4.冻结状态:释放了CPU的执行资格和执行资格
Sleep( time )函数 time 结束冻结状态自动结束
wait()开始冻结 notity() 冻结结束
结束冻结后处于运行状态也可能处于暂时阻塞状态
5.暂时阻塞:CPU在某一个时刻只能处理一个程序其他的程序就处于暂时阻塞状态(时间极短)
具有执行资格,暂时不具有执行资格
//插入图片//
2.一个路径只能被开启一次