多线程案例
/*
同步函数用的是哪一个锁?
*/
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