1概念的区别:
至于两者的真正区别最主要的就是一个是继承,一个是实现;其他还有一些面向对象的思想,Runnable就相当于一个作业,而Thread 才是真正的线程。
Runnable就是一个方法体,什么也不干
Public interface Runnable { publicabstractvoid run(); }
|
Thread 是真正的多线程的开启者。Thread也实现了Runnable的接口,他实现了run方法,我继承以后,一般都重写run方法了。
1.1 Thread 才是真真正正的多线程的开启者。
1.2 他们也是都可以共享资源,也可以各自开启一个对象的线程
2.他们的用法的不同,
2.1 Thread的用法是:
publicclass TicketThread extends 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 (Exception e) { e.printStackTrace(); } } } } } publicstaticvoid main(String[] arg){
TicketThread t1 = new TicketThread(); TicketThread t2 = new TicketThread(); //用Thread的开启多线程。 new Thread(t1,"线程1").start(); new Thread(t1,"线程2").start(); //------------------------------------------------------------- //----这个叫两个对象,t1和t2对象 各自开启了自己的线程。不是多线程,是单线程--- 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 Integer ticket = 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 Integer ticket = 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.线程池: