Java中线程3 应用

应用一:

售卖车票例子:售票的动作需要“同时进行”,因此使用多线程技术

//代码

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.一个路径只能被开启一次

猜你喜欢

转载自blog.csdn.net/Stitch__/article/details/81123054