以下是一段线程小程序代码,模拟了一个两个卖票口出票的小程序:

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所声明对象只能被构造一次,若语句下还有构造则系统提示语法错误。

  

 

posted on 2017-05-24 10:01  天边有颗星星航  阅读(1048)  评论(0)    收藏  举报