java基础:多线程基础例题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适合多数据
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值