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();
//-------------------------------------------------------------
//----这个叫两个对象,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 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.线程池:
- Thread和Runnable和线程池踩过的坑
- 线程(Thread) 和 Runnable
- java线程---Runnable和Thread的区别
- Java线程-Runnable和Thread的区别
- java线程---Runnable和Thread的区别
- Java 线程 Runnable和Thread的区别
- 线程Thread和Runnable的区别
- 线程创建Thread和Runnable
- Thread和Runnable创建线程
- java线程系列---Runnable和Thread的区别、线程同步
- 线程--Thread和Runnable创建线程的区别
- Runnable和Thread两种方式创建线程的比较
- java线程系列---Runnable和Thread的区别
- java线程系列---Runnable和Thread的区别
- java线程系列---Runnable和Thread的区别
- java线程系列---Runnable和Thread的区别
- 线程之Runnable和Thread现实的好处
- java线程系列---Runnable和Thread的区别
- 欢迎使用CSDN-markdown编辑器
- strust2的核心和工作原理
- 使用thinkphp的整个流程
- Python实现二叉树存储结构的堆排序
- 实现透明Dialog样式的Activity
- Thread和Runnable和线程池踩过的坑
- 使用merge_config 合并两个或多个kernel config
- Cookie/Session机制详解
- Error:Conflict with dependency 'com.android.support:support-v4' in project ':app'...解决方案
- 【Unity编程】Unity中的欧拉旋转
- spring applicationcontext.xml配置分析
- 工作组网站
- PAT 1059. Prime Factors (25)
- Windows下cef flash问题