多线程

多线程案例


/*
同步函数用的是哪一个锁?

*/

class Ticket implements Runnable
{
    private int tick=1000;
    Object obj = new Object();
    boolean flag =true;
    public void run()
    {   if(flag)
        {
        while (true) { // 0 1
            // synchronized (obj) { // 0 1 Flag
            synchronized (obj)//this
            {
                if (tick > 0)//0 1 2 3 tick=0;
                { //
                    try {
                        Thread.sleep(10);
                    } catch (Exception e) {
                    }
                    System.out.println(Thread.currentThread().getName() + ".....code...." + tick--);
                }
            }
            //this.show();
            }
         }
         else
             while(true)
                 show();
    }
      public synchronized void show()//this
        {
            if (tick > 0)//0 1 2 3 tick=0;
            { //
                try {
                    Thread.sleep(10);
                } catch (Exception e) {
                }
                System.out.println(Thread.currentThread().getName() + ".....show.." + tick--);
            }
        }
        //}
}


public class ThisLockDemo {
    public static void main(String [] args){
        Ticket t = new Ticket();
        Thread t1 = new Thread(t);
        Thread t2 = new Thread(t);

   // step 1 show?
        //t flag =ture
        t1.start() ; //T1 ready  T2  Tmain

        /*try {                     //try catch语句的作用是将主线程睡10ms,
            Thread.sleep(10);
        } catch (Exception e) {
        }*/
        t.flag =false; //Tmain

        t2.start();//T2

    }
}

当代码中红色部分被注释掉后,运行程序,结果如下:

Thread-0.....show..100
Thread-1.....show..99
Thread-1.....show..98
Thread-1.....show..97
Thread-1.....show..96
Thread-1.....show..95
Thread-1.....show..94
Thread-1.....show..93
Thread-1.....show..92
Thread-1.....show..91
Thread-1.....show..90
Thread-1.....show..89
Thread-1.....show..88
Thread-1.....show..87
Thread-1.....show..86
Thread-1.....show..85
Thread-1.....show..84
Thread-1.....show..83
Thread-1.....show..82
Thread-1.....show..81
Thread-1.....show..80
Thread-1.....show..79
Thread-1.....show..78
Thread-1.....show..77
Thread-1.....show..76
Thread-1.....show..75
Thread-1.....show..74
Thread-1.....show..73
Thread-1.....show..72
Thread-1.....show..71
Thread-1.....show..70
Thread-1.....show..69
Thread-1.....show..68
Thread-1.....show..67
Thread-1.....show..66
Thread-1.....show..65
Thread-1.....show..64
Thread-1.....show..63
Thread-1.....show..62
Thread-1.....show..61
Thread-1.....show..60
Thread-1.....show..59
Thread-1.....show..58
Thread-1.....show..57
Thread-1.....show..56
Thread-1.....show..55
Thread-1.....show..54
Thread-1.....show..53
Thread-1.....show..52
Thread-1.....show..51
Thread-1.....show..50
Thread-1.....show..49
Thread-1.....show..48
Thread-1.....show..47
Thread-1.....show..46
Thread-1.....show..45
Thread-1.....show..44
Thread-1.....show..43
Thread-1.....show..42
Thread-1.....show..41
Thread-1.....show..40
Thread-1.....show..39
Thread-1.....show..38
Thread-1.....show..37
Thread-1.....show..36
Thread-1.....show..35
Thread-1.....show..34
Thread-1.....show..33
Thread-1.....show..32
Thread-1.....show..31
Thread-1.....show..30
Thread-1.....show..29
Thread-1.....show..28
Thread-1.....show..27
Thread-1.....show..26
Thread-1.....show..25
Thread-1.....show..24
Thread-1.....show..23
Thread-1.....show..22
Thread-1.....show..21
Thread-1.....show..20
Thread-1.....show..19
Thread-1.....show..18
Thread-1.....show..17
Thread-1.....show..16
Thread-1.....show..15
Thread-1.....show..14
Thread-1.....show..13
Thread-1.....show..12
Thread-1.....show..11
Thread-1.....show..10
Thread-1.....show..9
Thread-1.....show..8
Thread-1.....show..7
Thread-1.....show..6
Thread-1.....show..5
Thread-1.....show..4
Thread-1.....show..3
Thread-0.....show..2
Thread-0.....show..1
解释:

run方法中的if(flag)和while(true)判断语句所用时间比t.flag=false时间长,所以会先执行主线程中的t.flag=false语句,将flag置为false,后续的Thread0和Thread1线程将从else中进入,所以Thread0和Thread1都将输出show,并且当Thread0或Thread1进入else的while(true)语句块,切换后在切回来之后,一直是在while(true)循环中。


将try catcfh语句块去掉注释后,如下:

class Ticket implements Runnable
{
    private int tick=100;
    Object obj = new Object();
    boolean flag =true;
    public void run()
    {   if(flag)
        {
        while (true) { // 0 1
            // synchronized (obj) { // 0 1 Flag
            synchronized (obj)//this
            {
                if (tick > 0)//0 1 2 3 tick=0;
                { //
                    try {
                        Thread.sleep(10);
                    } catch (Exception e) {
                    }
                    System.out.println(Thread.currentThread().getName() + ".....code...." + tick--);
                }
            }
            //this.show();
            }
         }
         else
             while(true)
                 show();
    }
      public synchronized void show()//this
        {
            if (tick > 0)//0 1 2 3 tick=0;
            { //
                try {
                    Thread.sleep(10);
                } catch (Exception e) {
                }
                System.out.println(Thread.currentThread().getName() + ".....show.." + tick--);
            }
        }
        //}
}


public class ThisLockDemo {
    public static void main(String [] args){
        Ticket t = new Ticket();
        Thread t1 = new Thread(t);
        Thread t2 = new Thread(t);

   // step 1 show?
        //t flag =ture
        t1.start() ; //此时,T1 ready   Tmain

        try {
            Thread.sleep(10);      //try catch的作用是将主线程睡10ms,执行完try catch后,目前只有T1线程处于就绪,所以执行T1
        } catch (Exception e) {
        }
        t.flag =false; //Tmain

        t2.start();//T2

    }
}

运行后,执行结果如下:

Thread-0.....code....100
Thread-1.....show..99
Thread-0.....code....98
Thread-1.....show..97
Thread-0.....code....96
Thread-1.....show..95
Thread-0.....code....94
Thread-1.....show..93
Thread-0.....code....92
Thread-1.....show..91
Thread-0.....code....90
Thread-1.....show..89
Thread-0.....code....88
Thread-1.....show..87
Thread-0.....code....86
Thread-1.....show..85
Thread-0.....code....84
Thread-1.....show..83
Thread-0.....code....82
Thread-1.....show..81
Thread-0.....code....80
Thread-1.....show..79
Thread-0.....code....78
Thread-1.....show..77
Thread-0.....code....76
Thread-1.....show..75
Thread-0.....code....74
Thread-1.....show..73
Thread-0.....code....72
Thread-1.....show..71
Thread-0.....code....70
Thread-1.....show..69
Thread-0.....code....68
Thread-1.....show..67
Thread-0.....code....66
Thread-1.....show..65
Thread-0.....code....64
Thread-1.....show..63
Thread-0.....code....62
Thread-1.....show..61
Thread-0.....code....60
Thread-1.....show..59
Thread-0.....code....58
Thread-1.....show..57
Thread-0.....code....56
Thread-1.....show..55
Thread-0.....code....54
Thread-1.....show..53
Thread-0.....code....52
Thread-1.....show..51
Thread-0.....code....50
Thread-1.....show..49
Thread-0.....code....48
Thread-1.....show..47
Thread-0.....code....46
Thread-1.....show..45
Thread-0.....code....44
Thread-1.....show..43
Thread-0.....code....42
Thread-1.....show..41
Thread-0.....code....40
Thread-1.....show..39
Thread-0.....code....38
Thread-1.....show..37
Thread-0.....code....36
Thread-1.....show..35
Thread-0.....code....34
Thread-0.....code....33
Thread-1.....show..33
Thread-1.....show..32
Thread-0.....code....32
Thread-0.....code....31
Thread-1.....show..30
Thread-1.....show..28
Thread-0.....code....29
Thread-1.....show..27
Thread-0.....code....26
Thread-0.....code....25
Thread-1.....show..25
Thread-0.....code....24
Thread-1.....show..23
Thread-1.....show..22
Thread-0.....code....21
Thread-1.....show..20
Thread-0.....code....19
Thread-0.....code....18
Thread-1.....show..17
Thread-1.....show..16
Thread-0.....code....15
Thread-1.....show..14
Thread-0.....code....14
Thread-1.....show..12
Thread-0.....code....13
Thread-1.....show..11
Thread-0.....code....10
Thread-1.....show..9
Thread-0.....code....8
Thread-1.....show..7
Thread-0.....code....6
Thread-1.....show..5
Thread-0.....code....4
Thread-1.....show..3
Thread-0.....code....2
Thread-1.....show..1
Thread-0.....code....0

解释:
执行完t1.start()之后,t1变为就绪态,开始执行try catch,然后将主线程睡10ms,此时try catch下的语句不在执行,t1从就绪转为执行,由于Ticket类初始化时将flag置为True,所以T1进入if模块执行,然后进入while(true)模块(此后,当T1被切换为其他线程再被切换回T1时,T1始终都在while(true)语句块内,这就是此处用while(true)的巧妙之处,else块中while(true)块同理),所以,T1一直输出code;之后的某个时刻,main线程睡醒(由阻塞转为就绪)并获取到cpu,接着执行try catch下面的语句,flag被赋值为false,T2.start()后T2也处于就绪,当T2执行时,flag为false,走的是else块中的while(true)块,所以T2一直输出show

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值