多线程基础例题1

多线程基础例题1

创建三个窗口卖票,总票数100张

先用Thread方法写一遍代码

package new1;

public class demo3 {
   public static void main(String[] args) {
       window t1 = new window();
       window t2 = new window();
       window t3 = new window();

       t1.setName("窗口1");
       t2.setName("窗口2");
       t3.setName("窗口3");

       t1.start();
       t2.start();
       t3.start();
  }

}

class window extends Thread{
   private int ticket = 50;

   public void run(){

       while(true){
           if(ticket>0){
               System.out.println(getName()+"卖票,票号为:"+ticket);
               ticket--;
          }else{
               break;
          }
      }
  }
}

结果

窗口1卖票,票号为:50
窗口1卖票,票号为:49
窗口1卖票,票号为:48
窗口1卖票,票号为:47
窗口1卖票,票号为:46
窗口1卖票,票号为:45
窗口1卖票,票号为:44
窗口1卖票,票号为:43
窗口3卖票,票号为:50
窗口3卖票,票号为:49
窗口3卖票,票号为:48
窗口3卖票,票号为:47
窗口3卖票,票号为:46
窗口2卖票,票号为:50
窗口2卖票,票号为:49
窗口2卖票,票号为:48
窗口3卖票,票号为:45
窗口3卖票,票号为:44
窗口3卖票,票号为:43
窗口3卖票,票号为:42
窗口3卖票,票号为:41
窗口3卖票,票号为:40
窗口1卖票,票号为:42
窗口3卖票,票号为:39
窗口3卖票,票号为:38
窗口3卖票,票号为:37
窗口2卖票,票号为:47
窗口3卖票,票号为:36
窗口1卖票,票号为:41
窗口1卖票,票号为:40
窗口1卖票,票号为:39
窗口1卖票,票号为:38
窗口1卖票,票号为:37
窗口1卖票,票号为:36
窗口1卖票,票号为:35
窗口1卖票,票号为:34
窗口1卖票,票号为:33
窗口1卖票,票号为:32
窗口1卖票,票号为:31
窗口1卖票,票号为:30
窗口1卖票,票号为:29
窗口1卖票,票号为:28
窗口1卖票,票号为:27
窗口1卖票,票号为:26
窗口1卖票,票号为:25
窗口3卖票,票号为:35
窗口3卖票,票号为:34
窗口3卖票,票号为:33
窗口3卖票,票号为:32
窗口3卖票,票号为:31
窗口3卖票,票号为:30
窗口3卖票,票号为:29
窗口3卖票,票号为:28
窗口3卖票,票号为:27
窗口3卖票,票号为:26
窗口3卖票,票号为:25
窗口3卖票,票号为:24
窗口3卖票,票号为:23
窗口2卖票,票号为:46
窗口2卖票,票号为:45
窗口2卖票,票号为:44
窗口2卖票,票号为:43
窗口3卖票,票号为:22
窗口3卖票,票号为:21
窗口1卖票,票号为:24
窗口1卖票,票号为:23
窗口1卖票,票号为:22
窗口1卖票,票号为:21
窗口1卖票,票号为:20
窗口1卖票,票号为:19
窗口3卖票,票号为:20
窗口3卖票,票号为:19
窗口3卖票,票号为:18
窗口3卖票,票号为:17
窗口3卖票,票号为:16
窗口3卖票,票号为:15
窗口3卖票,票号为:14
窗口3卖票,票号为:13
窗口3卖票,票号为:12
窗口3卖票,票号为:11
窗口3卖票,票号为:10
窗口3卖票,票号为:9
窗口3卖票,票号为:8
窗口3卖票,票号为:7
窗口3卖票,票号为:6
窗口3卖票,票号为:5
窗口2卖票,票号为:42
窗口2卖票,票号为:41
窗口2卖票,票号为:40
窗口2卖票,票号为:39
窗口2卖票,票号为:38
窗口2卖票,票号为:37
窗口2卖票,票号为:36
窗口2卖票,票号为:35
窗口2卖票,票号为:34
窗口2卖票,票号为:33
窗口2卖票,票号为:32
窗口2卖票,票号为:31
窗口3卖票,票号为:4
窗口3卖票,票号为:3
窗口3卖票,票号为:2
窗口3卖票,票号为:1
窗口1卖票,票号为:18
窗口2卖票,票号为:30
窗口1卖票,票号为:17
窗口1卖票,票号为:16
窗口1卖票,票号为:15
窗口1卖票,票号为:14
窗口2卖票,票号为:29
窗口2卖票,票号为:28
窗口2卖票,票号为:27
窗口2卖票,票号为:26
窗口2卖票,票号为:25
窗口1卖票,票号为:13
窗口1卖票,票号为:12
窗口1卖票,票号为:11
窗口1卖票,票号为:10
窗口2卖票,票号为:24
窗口1卖票,票号为:9
窗口1卖票,票号为:8
窗口1卖票,票号为:7
窗口1卖票,票号为:6
窗口1卖票,票号为:5
窗口1卖票,票号为:4
窗口1卖票,票号为:3
窗口1卖票,票号为:2
窗口2卖票,票号为:23
窗口2卖票,票号为:22
窗口2卖票,票号为:21
窗口2卖票,票号为:20
窗口2卖票,票号为:19
窗口2卖票,票号为:18
窗口2卖票,票号为:17
窗口2卖票,票号为:16
窗口2卖票,票号为:15
窗口2卖票,票号为:14
窗口2卖票,票号为:13
窗口2卖票,票号为:12
窗口2卖票,票号为:11
窗口2卖票,票号为:10
窗口2卖票,票号为:9
窗口2卖票,票号为:8
窗口2卖票,票号为:7
窗口2卖票,票号为:6
窗口2卖票,票号为:5
窗口2卖票,票号为:4
窗口2卖票,票号为:3
窗口2卖票,票号为:2
窗口2卖票,票号为:1
窗口1卖票,票号为:1

此时不是50张而是150张,应该修改private为static,实现数据共享

package new1;

public class demo3 {
   public static void main(String[] args) {
       window t1 = new window();
       window t2 = new window();
       window t3 = new window();

       t1.setName("窗口1");
       t2.setName("窗口2");
       t3.setName("窗口3");

       t1.start();
       t2.start();
       t3.start();
  }

}

class window extends Thread{
   private  static int ticket = 5;

   public void run(){

       while(true){
           if(ticket>0){
               System.out.println(getName()+"卖票,票号为:"+ticket);
               ticket--;
          }else{
               break;
          }
      }
  }
}
窗口2卖票,票号为:5
窗口2卖票,票号为:4
窗口2卖票,票号为:3
窗口2卖票,票号为:2
窗口2卖票,票号为:1
窗口1卖票,票号为:5
窗口3卖票,票号为:5

很明显有重复的票号,所以应该解决多线程的安全问题,这点放在下一节锁的学习再来解决

使用runnable接口的方式

package new1;


public class demo4 {
   public static void main(String[] args) {
      Window1 w = new Window1(); //此时只造了一个对象

      Thread t1 = new Thread(w);  //一个对象放到三个构造器中,相当于三个线程用的同一个对象,所以ticket不用担心是总数是300
      Thread t2 = new Thread(w);
      Thread t3 = new Thread(w);

      t1.setName("窗口一");
      t2.setName("窗口二");
      t3.setName("窗口三");

      t1.start();
      t2.start();
      t3.start();
  }
}
//创建一个实现了Runnable接口的类
class Window1 implements Runnable{
   private int ticket = 100;
   public void run(){
      while(true){
          if(ticket > 0){
              System.out.println(Thread.currentThread().getName()+"卖票,票号为:"+ticket);
              ticket--;
          }else{
              break;
          }
      }
      }
  }

结果

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

很明显也存在安全问题,所以需要学习锁来尝试解决问题

这两种方法的区别是,Tread继承有局限性,如果类本身就是某一个类的子类,则无法继承Tread,但可以实现Runnable接口。还有就是共享数据的问题了,Runnable适合多数据

 

posted @ 2021-02-11 00:04  蒸汽黑子  阅读(195)  评论(0)    收藏  举报