多线程
1.概念
同一进程内并发执行的代码块。
灵活响应的桌面程序。
界面友好,用户体验。
耗时应用.
2.
3.
4.
并发计算 //通常指同一进程内的多个线程并发执行。
并行计算 //硬件资源层面,集群计算。
Thread
java.lang.Thread
class MyThread
1.不要较真.
2.start();
Thread.start() //开启线程
Thread.run() //线程执行方法。
static Thread.yield() //放弃CPU抢占权,瞬间即逝。谦让的意思。
static Thread.sleep() //让当前线程休眠时间(毫秒)
Thread.join() //等待分线程执行完成后再运行。
Daemon //守护线程,以服务的身份出现。
//守护线程守护的非守护线程,如果进程内剩余的线程都是守护线程,应用就结束了。
安全问题
买票问题。
Debug
锁.
blocked //阻塞
synchronized //同步,使用的同一把锁.
//synchronized(obj){...}
//同步方法粒度较粗。非静态方法以当前对象为锁。
//静态方法以class为锁。
粒度 //粒度粗细.
汽车过山洞
1. 5辆汽车,
2. 每次通过一辆汽车。
3. 每辆汽车通过时间不同(1m 2m 3m 4m 5m)。
4. 通过多线程模拟.
[stack]
FILO //first in last out
[queue]
FIFO //fist in first out
堆区
栈区
默认1m空间。
11xxx多方法后溢出。
2m:
23xxx方法后溢出。
package com.it18zhang.thread.stack;
public class StackOverflowDemo {
public static void main(String[] args) {
sayHello(1);
}
public static void sayHello(int i){
System.out.println(i);
i ++ ;
sayHello(i);
}
}
//
method
java //java命令行帮助
java -X //查看非标准选项
java -X
java -Xss2m //java stackSize,默认1m. 11xxx
这是jvm堆空间大小
java -Xmx20m //最大值
java -Xms20m //初始值
OutOfMemoryError
内存溢出.堆空间不足。
notyfyAll //获得锁旗标后才能调
sleep() //
wait(); //获得锁旗标后才能调
1 /**
2 蜜蜂和熊的生产消费关系,熊能在蜜蜂10斤吃掉,蜜蜂一次生产一斤蜂蜜,且蜜蜂生产一斤蜂蜜话费的时间 3 是10ms 4 蜜蜂:有个包,最大容量Max=20斤,每次产1斤,耗时10ms; 满足5斤的时候给蜜罐添加 5 蜜罐:最大容量max=30; 6 2只熊 7 8 */ 9 public class BeeDemo{ 10 public static void main(String[]args){ 11 Box box=new Box();//蜜罐 12 Bee bee1=new Bee("b-1",box); 13 Bee bee2=new Bee("b-2",box); 14 Bee bee3=new Bee("b-3",box); 15 Bee bee4=new Bee("b-4",box); 16 Bee bee5=new Bee("b-5",box); 17 Bee bee6=new Bee("b-6",box); 18 Bee bee7=new Bee("b-7",box); 19 Bee bee8=new Bee("b-8",box); 20 Bee bee9=new Bee("b-9",box); 21 Bee bee10=new Bee("b-10",box); 22 Bear bear1=new Bear(box,"熊大"); 23 // Bear bear2=new Bear(box,"熊二"); 24 bee1.start(); 25 bee2.start(); 26 bee3.start(); 27 bee4.start(); 28 bee5.start(); 29 bee6.start(); 30 bee7.start(); 31 bee8.start(); 32 bee9.start(); 33 bee10.start(); 34 bear1.start(); 35 // bear2.start(); 36 } 37 } 38 //蜜蜂 39 class Bee extends Thread{ 40 private int bag; 41 private static final int BAG_MAX=20;//包的最大容量 42 private static final int ONCE=5;//没生产5斤可以放入蜜罐 43 private static final int TIME=10;//生产一斤话费10ms 44 private Box box; 45 private String name; 46 public Bee(String name,Box box){ 47 this.name=name; 48 this.box=box; 49 } 50 public void run(){ 51 while(true){ 52 //满足放蜂蜜条件 53 if(bag>=5){ 54 synchronized(box){ 55 //当前蜜罐的量 56 int cap=box.capacity; 57 //蜜罐已满 58 if(cap>=box.MAX){ 59 box.notifyAll();//通知熊来吃 60 } 61 //蜜罐未满 62 else{ 63 //蜜罐剩余空间 64 int remain=box.MAX-cap; 65 //蜂蜜带的蜂蜜可以装满蜜罐 66 if(bag>=remain){ 67 box.capacity=Box.MAX; 68 //放后蜜蜂的小包剩余量 69 bag=bag-remain; 70 System.out.println(name+",添加了="+remain+",name.bag="+bag+",蜜罐有"+box.capacity); 71 72 box.notifyAll();//通知熊来吃 73 } 74 //蜜蜂的小包量不足以加满蜜罐 75 else{ 76 box.capacity=box.capacity+bag; 77 System.out.println(name+",添加了="+bag+",name.bag=:"+bag+",蜜罐有"+box.capacity); 78 bag=0; 79 } 80 } 81 } 82 83 } 84 //向小包增加蜂蜜 85 if(bag>=Bee.BAG_MAX){ 86 synchronized(box){ 87 try{ 88 box.wait(); 89 }catch(Exception e){ 90 } 91 } 92 } 93 else{ 94 bag++; 95 System.out.println(name+".bag:"+bag); 96 try{ 97 Thread.sleep(10);//休眠10ms 98 }catch(Exception e){ 99 } 100 } 101 } 102 } 103 } 104 //蜜罐 105 class Box{ 106 public static final int MAX=30;//蜜罐最大容量 107 public int capacity=0;//目前蜂蜜的的量,初始为0 108 } 109 //熊 110 class Bear extends Thread{ 111 private Box box; 112 private String name; 113 public Bear(Box box,String name){ 114 super(); 115 this.box=box; 116 this.name=name; 117 } 118 public void run(){ 119 while(true){ 120 121 synchronized(box){ 122 if(box.capacity==Box.MAX){ 123 System.out.println(name+":吃掉了"+box.capacity); 124 box.capacity=0; 125 try{ 126 Thread.sleep(1000); 127 }catch(Exception e){ 128 129 } 130 box.notifyAll(); 131 } 132 else{ 133 try{ 134 135 box.wait(); 136 }catch(Exception e){ 137 e.printStackTrace(); 138 } 139 } 140 } 141 } 142 143 } 144 }
2、
1 /** 2 * 100个和尚。 3 300馒头 4 每个和尚最多吃4个馒头。 5 每个和尚至少吃一个馒头. 6 尽可能快的把馒头吃掉。 7 * 8 */ 9 public class MonkMain { 10 11 public static void main(String[] args) { 12 Basket bas = new Basket(); 13 for(int i=1;i<=100;i++){ 14 new Monk("和尚"+i,bas).start(); 15 } 16 } 17 } 18 19 20 public class Basket { 21 private String name; 22 private Monk monk; 23 private static int MANTOU_COUNT = 300;// 馒头总数 24 private int MONKS_COUNT = 100;// 和尚总数 25 private int remainManos = MANTOU_COUNT;// 剩余馒头数 26 private int remainMonks = MONKS_COUNT;// 剩余没吃馒头的和尚 27 28 // 和尚取馒头 29 public synchronized int getMantou(Monk monk) { 30 // 如果剩余馒头为0 31 if (remainManos == 0) { 32 return 0; 33 } 34 // 如果和尚已经吃了4个,则不能再取馒头 35 if (monk.getEatList().size() >= monk.MAX) { 36 return 0; 37 } 38 // 剩余馒头数大于一次还没取馒头的和尚数 39 if (remainManos > remainMonks) { 40 // 当前和尚还没吃过馒头 41 if (monk.getEatList().size() == 0) { 42 // 可以继续取馒头,馒头剩余数减少1 43 int tem = remainManos; 44 remainManos--; 45 // 剩余没吃馒头的和尚数减少1 46 remainMonks--; 47 return tem; 48 } else {// 当前和尚吃过馒头 49 // 直接剩余馒头数减去1 50 int tem = remainManos; 51 remainManos--; 52 return tem; 53 } 54 } 55 // 剩余馒头数=一次还没取馒头的和尚数 56 if (remainManos == remainMonks) { 57 // 当前取馒头的是还没吃过的和尚,可以取走 58 if (monk.getEatList().size() == 0) { 59 int tem = remainManos; 60 remainManos--; 61 remainMonks--; 62 return tem; 63 } else {// 当前取馒头的和尚已经吃过了,则不能再吃了 64 return 0; 65 } 66 } else { 67 return 0; 68 } 69 } 70 } 71 72 public class Monk extends Thread { 73 private String name; 74 private Basket bas; 75 public static int MAX=4;//做多吃的馒头数 76 77 ArrayList<Integer> eatList =new ArrayList();//吃的馒头容器 78 public Monk(String name, Basket bas) { 79 super(); 80 this.name = name; 81 this.bas = bas; 82 } 83 public ArrayList getEatList() { 84 return eatList; 85 } 86 @Override 87 public void run() { 88 while(true){ 89 int mantoNo=bas.getMantou(this);//当前吃的馒头编号 90 if(mantoNo!=0){ 91 eatList.add(mantoNo); 92 } 93 else{ 94 break; 95 } 96 } 97 String str=""; 98 for (Integer i : eatList) { 99 str=str+i+","; 100 } 101 System.out.println(name+"总共吃了"+eatList.size()+"个馒头,编号分别为:"+str); 102 } 103 }
3、
1 class Syn{ 2 public static void main(String[]args){ 3 Pool pool=new Pool(); 4 Produce p1=new Produce("王二",pool); 5 Produce p2=new Produce("赵四",pool); 6 Produce p3=new Produce("麻子",pool); 7 Consumer c1=new Consumer("lisi",pool); 8 Consumer c2=new Consumer("Tom",pool); 9 p1.start(); 10 p2.start(); 11 p3.start(); 12 c1.start(); 13 c2.start(); 14 } 15 } 16 //生产者 17 class Produce extends Thread{ 18 private String name; 19 private Pool pool; 20 public Produce(){}; 21 public Produce(String name,Pool pool){ 22 this.name=name; 23 this.pool=pool; 24 } 25 public void run(){ 26 int i=0; 27 pool.add(i++); 28 try{ 29 30 Thread.sleep(100); 31 }catch(Exception e){} 32 System.out.println("生产:"+i); 33 } 34 } 35 //消费者 36 class Consumer extends Thread{ 37 private String name; 38 private Pool pool; 39 public Consumer(){} 40 public Consumer(String name,Pool pool){ 41 this.name=name; 42 this.pool=pool; 43 } 44 public void run(){ 45 int i=0; 46 while(true){ 47 int i=pool.remove(); 48 try{ 49 50 Thread.sleep(100); 51 }catch(Exception e){ 52 e.printStackTrace(); 53 } 54 System.out.println("消费"+i); 55 56 } 57 58 } 59 } 60 class Pool{ 61 private java.util.List<Integer> list=new java.util.ArrayList<Integer>(); 62 int Max=100; 63 //增加元素 64 public void add(int n){ 65 synchronized(this){ 66 try{ 67 while(list.size()>=Max){ 68 this.wait(); 69 } 70 list.add(n); 71 System.out.println("剩余库存"+list.size()); 72 notifyAll(); 73 74 }catch(Exception e){ 75 e.printStackTrace(); 76 } 77 } 78 79 } 80 //删除元素 81 public void remove(){ 82 // int i; 83 synchronized(this){ 84 try{ 85 86 while(list.size()==0){ 87 this.wait(); 88 } 89 90 }catch(Exception e){ 91 e.printStackTrace(); 92 } 93 94 int i=list.remove(0); 95 notify(); 96 } 97 98 } 99 }
3、
1 /** 2 100个馒头,40个工人吃,每个工人最多吃3个馒头,使用多线程给出所有工人吃馒头情况 3 */ 4 //定义一个篮子 5 class Bastket{ 6 private int count =100;//馒头总个数 7 public int getManTou(){ 8 synchronized(this){//锁旗标,以篮子作为参照物 9 int tem=count; 10 count=count-1; 11 return tem>0?tem:0;//三元运算符 12 } 13 } 14 15 } 16 class Worker extends Thread{ 17 private String name; 18 private Bastket bas; 19 private int MAX=3;//最多吃3个 20 int num=0;//吃的馒头数 21 public Worker(){}; 22 public Worker(String name,Bastket bas){ 23 this.name=name; 24 this.bas=bas; 25 } 26 public void run(){ 27 while(true){ 28 if(num>=3){ 29 return; 30 } 31 int no=bas.getManTou();//剩余馒头个数 32 if(no==0){ 33 return; 34 } 35 num++; 36 System.out.println(name+" 吃的第"+num+"个馒头"); 37 } 38 } 39 } 40 class SynDemo{ 41 public static void main(String[]args){ 42 Bastket bas=new Bastket(); 43 for(int i=1;i<=40;i++){ 44 new Worker("worker--"+i,bas).start(); 45 } 46 } 47 }
4、
1 class Syn{ 2 public static void main(String[]args){ 3 Saler s1=new Saler("张三"); 4 Saler s2=new Saler("王二"); 5 Saler s3=new Saler("李四"); 6 Saler s4=new Saler("麻子"); 7 s1.start(); 8 s2.start(); 9 s3.start(); 10 s4.start(); 11 12 } 13 } 14 class Saler extends Thread{ 15 static Object lock=new Object();//锁旗标 16 private String name; 17 static int tickets=50;//票数 18 public Saler(){} 19 public Saler(String name){ 20 this.name=name; 21 } 22 public void run(){ 23 24 while(true){ 25 int t=getTicket(); 26 if(t==0){ 27 return; 28 }else{ 29 System.out.println(name+"取走了第"+t+"张票"); 30 } 31 } 32 } 33 public int getTicket(){ 34 synchronized(lock){ 35 int t=tickets; 36 tickets=tickets-1; 37 return t<1?0:t; 38 } 39 } 40 }
1 /** 2 * 蜜蜂是生产者,100蜜蜂,2头熊。 3 蜜蜂每次生产蜂蜜量是1. 4 篮子的容量是100. 5 熊在蜂蜜量超过20的时候,一次性吃掉所有蜂蜜。 6 通过多线程模拟场景。 7 */ 8 public class BeeBearMain { 9 10 public static void main(String[] args) { 11 Basket basket = new Basket(); 12 for(int i=1;i<=100;i++){ 13 new Bee(basket,"小蜜蜂"+i).start(); 14 } 15 Bear b1=new Bear("熊大", basket); 16 Bear b2=new Bear("熊二", basket); 17 b1.start(); 18 b2.start(); 19 } 20 } 21 22 public class Bear extends Thread { 23 private String name; 24 private Basket bk; 25 public Bear(String name, Basket bk) { 26 super(); 27 this.name = name; 28 this.bk = bk; 29 } 30 public void run() { 31 while (true) { 32 synchronized (bk) { 33 while (bk.capacity <= 20) { 34 try { 35 bk.wait(); 36 } catch (InterruptedException e) { 37 e.printStackTrace(); 38 } 39 } 40 int tem = bk.capacity; 41 bk.capacity = 0; 42 bk.notifyAll(); 43 System.out.println(name + "吃完了" + tem + "蜂蜜"); 44 } 45 yield(); 46 } 47 } 48 } 49 50 public class Bee extends Thread { 51 private Basket bk; 52 private String name; 53 54 public Bee(Basket bk, String name) { 55 super(); 56 this.bk = bk; 57 this.name = name; 58 } 59 @Override 60 public void run() { 61 while (true) { 62 synchronized (bk) { 63 while (bk.capacity >= bk.MAX) { 64 try { 65 bk.wait(); 66 } catch (InterruptedException e) { 67 e.printStackTrace(); 68 } 69 } 70 bk.capacity++; 71 bk.notifyAll(); 72 } 73 int tem = bk.capacity; 74 System.out.println(name + "增加了蜂蜜,当前蜂蜜容量为:" + tem); 75 } 76 } 77 } 78 79 public class Basket { 80 public static final int MAX = 100;// 篮子最大容量 81 public static int capacity = 0;// 篮子的目前容量 82 }