Thread和Runnable和线程池踩过的坑

来源:互联网 发布:win10软件管家 编辑:程序博客网 时间:2024/05/29 16:59
 
1概念的区别:

         至于两者的真正区别最主要的就是一个是继承,一个是实现;其他还有一些面向对象的思想,Runnable就相当于一个作业,Thread才是真正的线程。

 

Runnable就是一个方法体,什么也不干

Public interface Runnable {

    publicabstractvoid run();

}

 

Thread 是真正的多线程的开启者。Thread也实现了Runnable的接口,他实现了run方法,我继承以后,一般都重写run方法了。

 

1.1 Thread 才是真真正正的多线程的开启者
1.2 他们也是都可以共享资源,也可以各自开启一个对象的线程
2.他们的用法的不同,
2.1 Thread的用法是:

 publicclass TicketThreadextends Thread{

 

    privateintticket = 10;

    @Override

    publicvoid run(){

        for(inti =0;i<10;i++){

            synchronized (this){

                if(this.ticket>0){

                    try {

                        Thread.sleep(100);

                        System.out.println(Thread.currentThread().getName()+"卖票---->"+(this.ticket--));

                    } catch (Exceptione) {

                        e.printStackTrace();

                    }

                }

            }

        }

    }

    publicstaticvoid main(String[]arg){

   

        TicketThreadt1 = newTicketThread();

        TicketThreadt2 = newTicketThread();

        //Thread的开启多线程。

        new Thread(t1,"线程1").start();

        new Thread(t1,"线程2").start();

//-------------------------------------------------------------      

//----这个叫两个对象,t1t2对象 各自开启了自己的线程。不是多线程,是单线程--- 

        TicketThread t1 = new TicketThread();

        TicketThread t2 = new TicketThread();

       

        t1.start();

        //t1.start();//不支持多次start

        t2.start();

    }

}

注释的打印的结果

线程1卖票---->10

线程1卖票---->9

线程1卖票---->8

线程1卖票---->7

线程1卖票---->6

线程2卖票---->5

线程2卖票---->4

线程1卖票---->3

线程1卖票---->2

线程1卖票---->1

 

 

//---------------未注释打印的结果----------------------------------------------

Thread-0卖票---->10

Thread-1卖票---->10

Thread-0卖票---->9

Thread-1卖票---->9

Thread-0卖票---->8

Thread-1卖票---->8

Thread-0卖票---->7

Thread-1卖票---->7

Thread-0卖票---->6

Thread-1卖票---->6

Thread-0卖票---->5

Thread-1卖票---->5

Thread-0卖票---->4

Thread-1卖票---->4

Thread-0卖票---->3

Thread-1卖票---->3

Thread-0卖票---->2

Thread-1卖票---->2

Thread-0卖票---->1

Thread-1卖票---->1

注意一下这个两个的不同的结果

2.2 Runnable的用法是:

publicclass  TicketRunnable implements Runnable{

    private volatile Integerticket = 10;

    private  Integer temp=0;

    @Override

    public synchronizedvoid run() {

        //添加同步快

        synchronized (this){

        System.out.println("----------------------剩余:"+ticket+"张票------------------------------");

        System.out.println(Thread.currentThread().getName() +"-----实际买票"+temp+"");

            if(ticket>0){

              if(ticket-temp>=0){

                 ticket=ticket-temp;

                 //通过睡眠线程来模拟出最后一张票的抢票场景

                    System.out.println(Thread.currentThread().getName() +"支付现金买"+temp+"张后票,剩余"+ticket+"张票");

              }else{

                    System.out.println(Thread.currentThread().getName() +"要买"+temp+",余票不足,您只能买"+ticket+"张票");

              }

            }else{

              System.out.println(Thread.currentThread().getName()+"票已经卖完了");

            }

        }

    }

 

    publicstaticvoid main(String[]arg){ 

        Random random = new Random();

        TicketRunnable t1 = new TicketRunnable();

        for (inti = 0; i <20; i++) {

            t1.temp =random.nextInt(2)+1;

            new Thread(t1,"线程"+i+"要买"+t1.temp+"张票").start();

        }

        

    }

}

----------------------剩余:10张票------------------------------

线程0要买1张票-----实际买票2

线程0要买1张票支付现金买2张后票,剩余8张票

----------------------剩余:8张票------------------------------

线程2要买1张票-----实际买票2

线程2要买1张票支付现金买2张后票,剩余6张票

----------------------剩余:6张票------------------------------

线程4要买2张票-----实际买票1

线程4要买2张票支付现金买1张后票,剩余5张票

----------------------剩余:5张票------------------------------

线程1要买1张票-----实际买票1

线程1要买1张票支付现金买1张后票,剩余4张票

----------------------剩余:4张票------------------------------

线程6要买2张票-----实际买票1

线程6要买2张票支付现金买1张后票,剩余3张票

----------------------剩余:3张票------------------------------

线程3要买2张票-----实际买票1

线程3要买2张票支付现金买1张后票,剩余2张票

----------------------剩余:2张票------------------------------

线程8要买1张票-----实际买票1

线程8要买1张票支付现金买1张后票,剩余1张票

----------------------剩余:1张票------------------------------

线程7要买1张票-----实际买票1

线程7要买1张票支付现金买1张后票,剩余0张票

----------------------剩余:0张票------------------------------

线程5要买1张票-----实际买票1

线程5要买1张票票已经卖完了

----------------------剩余:0张票------------------------------

线程10要买1张票-----实际买票1

线程10要买1张票票已经卖完了

----------------------剩余:0张票------------------------------

线程12要买1张票-----实际买票1

线程12要买1张票票已经卖完了

----------------------剩余:0张票------------------------------

线程9要买1张票-----实际买票1

线程9要买1张票票已经卖完了

----------------------剩余:0张票------------------------------

线程11要买2张票-----实际买票1

线程11要买2张票票已经卖完了

 

package cn.javass.theard;

 

import java.util.HashMap;

import java.util.Map;

import java.util.Random;

 

publicclass  TicketRunnable implements Runnable{

    private volatile Integerticket = 20;

    private  Map<String ,Integer> container=new HashMap<String ,Integer>();

    publicsynchronizedvoid run() {

        //添加同步快

        synchronized (this){

        inttemp=0;

        Integer integer = container.get(Thread.currentThread().getName());

        if(integer!=null){

             temp=integer;

        }

        System.out.println("----------------------剩余:"+ticket+"张票------------------------------");

        System.out.println(Thread.currentThread().getName() +"-----实际买票"+temp+"");

            if(ticket>0){

              if(ticket-temp>=0){

                  //模拟出最后一张票的抢票场景

                 ticket=ticket-temp;

                    System.out.println(Thread.currentThread().getName() +"支付现金买"+temp+"张后票,剩余"+ticket+"张票");

              }else{

                    System.out.println(Thread.currentThread().getName() +"要买"+temp+",余票不足,您只能买"+ticket+"张票");

              }

            }else{

              System.out.println(Thread.currentThread().getName()+"票已经卖完了");

            }

            //清空map的键值。

            Integer remove = container.remove(Thread.currentThread().getName());

            System.out.println("----------------"+remove);

        }

    }

 

    publicstaticvoid main(String[]arg){ 

        Random random = new Random();   

        TicketRunnable t1 = new TicketRunnable();

        for (inti = 0; i <20; i++) {

            inta=random.nextInt(3)+1;

            t1.container.put("线程"+i+"客户_"+i+"要买"+a+"张票",a);

            new Thread(t1,"线程"+i+"客户_"+i+"要买"+a+"张票").start();

        }

        

    }

}

----------------------剩余:20张票------------------------------

线程0客户_0要买2张票-----实际买票2

线程0客户_0要买2张票支付现金买2张后票,剩余18张票

----------------2

----------------------剩余:18张票------------------------------

线程2客户_2要买3张票-----实际买票3

线程2客户_2要买3张票支付现金买3张后票,剩余15张票

----------------3

----------------------剩余:15张票------------------------------

线程4客户_4要买2张票-----实际买票2

线程4客户_4要买2张票支付现金买2张后票,剩余13张票

----------------2

----------------------剩余:13张票------------------------------

线程1客户_1要买1张票-----实际买票1

线程1客户_1要买1张票支付现金买1张后票,剩余12张票

----------------1

----------------------剩余:12张票------------------------------

线程14客户_14要买3张票-----实际买票3

线程14客户_14要买3张票支付现金买3张后票,剩余9张票

----------------3

----------------------剩余:9张票------------------------------

线程12客户_12要买2张票-----实际买票2

线程12客户_12要买2张票支付现金买2张后票,剩余7张票

----------------2

----------------------剩余:7张票------------------------------

线程3客户_3要买1张票-----实际买票1

线程3客户_3要买1张票支付现金买1张后票,剩余6张票

----------------1

----------------------剩余:6张票------------------------------

线程5客户_5要买3张票-----实际买票3

线程5客户_5要买3张票支付现金买3张后票,剩余3张票

----------------3

----------------------剩余:3张票------------------------------

线程10客户_10要买1张票-----实际买票1

线程10客户_10要买1张票支付现金买1张后票,剩余2张票

----------------1

----------------------剩余:2张票------------------------------

线程9客户_9要买3张票-----实际买票3

线程9客户_9要买3张票要买3,余票不足,您只能买2张票

----------------3

----------------------剩余:2张票------------------------------

线程11客户_11要买2张票-----实际买票2

线程11客户_11要买2张票支付现金买2张后票,剩余0张票

----------------2

----------------------剩余:0张票------------------------------

线程8客户_8要买1张票-----实际买票1

线程8客户_8要买1张票票已经卖完了

----------------1

----------------------剩余:0张票------------------------------

线程6客户_6要买1张票-----实际买票1

线程6客户_6要买1张票票已经卖完了

----------------1

----------------------剩余:0张票------------------------------

线程7客户_7要买1张票-----实际买票1

线程7客户_7要买1张票票已经卖完了

----------------1

----------------------剩余:0张票------------------------------

线程18客户_18要买3张票-----实际买票3

线程18客户_18要买3张票票已经卖完了

----------------3

----------------------剩余:0张票------------------------------

线程16客户_16要买3张票-----实际买票3

线程16客户_16要买3张票票已经卖完了

----------------3

----------------------剩余:0张票------------------------------

线程13客户_13要买1张票-----实际买票1

线程13客户_13要买1张票票已经卖完了

----------------1

----------------------剩余:0张票------------------------------

线程15客户_15要买2张票-----实际买票2

线程15客户_15要买2张票票已经卖完了

----------------2

----------------------剩余:0张票------------------------------

线程19客户_19要买3张票-----实际买票3

线程19客户_19要买3张票票已经卖完了

----------------3

----------------------剩余:0张票------------------------------

线程17客户_17要买3张票-----实际买票3

线程17客户_17要买3张票票已经卖完了

----------------3

3.线程池:

 

1 0
原创粉丝点击