以下是一段线程小程序代码,模拟了一个两个卖票口出票的小程序:
class yuan implements Runnable{
public static int piao=1;
public void run() {
while(piao<=20){
synchronized(""){
System.out.println(Thread.currentThread().getName()+"当前卖第"+piao+"张票");
piao++;
}
}
}
}
public class ceshi6 {
public void asd(){
Thread a=new Thread(new yuan());
Thread b=new Thread(new yuan());
b.setPriority(10);
a.setName("a口");
b.setName("b口");
a.start();
b.start();
}
public static void main(String[] args) {
ceshi6 q=new ceshi6();
q.asd();
}
}
执行结果如下:
a口当前卖第1张票
a口当前卖第2张票
b口当前卖第3张票
b口当前卖第4张票
b口当前卖第5张票
b口当前卖第6张票
b口当前卖第7张票
b口当前卖第8张票
b口当前卖第9张票
b口当前卖第10张票
b口当前卖第11张票
b口当前卖第12张票
b口当前卖第13张票
b口当前卖第14张票
b口当前卖第15张票
b口当前卖第16张票
b口当前卖第17张票
a口当前卖第18张票
a口当前卖第19张票
a口当前卖第20张票
b口当前卖第21张票
问题:很奇怪为什么明明循环20到头却执行了21?
原因:因为线程在运行while中不一定什么时候切换
可能是两个线程同时运行run 因为在synchronize前受阻 所以有一种情况就是两个线程都已经进入了while等待 但是同一时间只能有一个线程进入synchronize 所以假设a进入则b仍在等待 当a中的
piao+1之后 现在piao为21 而在synchronize门口等着的b并不会结束而是进入synchronize 用21输出 然后两个线程都 不满足while大条件 线程结束。
将代码修改为如下(只改run方法别的都不动)
public void run() {
while(true){
synchronized("aa"){
if(piao<=20){
System.out.println(Thread.currentThread().getName()+"当前卖第"+piao+"张票");
piao++;
}
else break;
}
}
}
总结:
1、多个线程同时抢一个cpu
2、setPriority:设置优先级 只是说被设置优先级的线程被分到的几率大一点并不是一定分到。默认优先级是5。
3、synchronize作用:加锁 在一个线程将synchronize中代码执行完成前其他的线程会被阻塞
4、重点给piao加上static 如果是一个类的对象分不同线程不加static也可以
5、new出来的每次new的都不一样,列{
Thread a=new Thread(new yuan());
Thread b=new Thread(new yuan());
这两个a和b线程 所对应的实现接口类对象是不同的
}
当日其他总结:
1、final所声明对象只能被构造一次,若语句下还有构造则系统提示语法错误。
浙公网安备 33010602011771号