您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 销售管理 > java线程生产者与消费者从基础到入门
packagecn.itcast.collection;/*数组:存储同一种数据类型的集合容器.数组的特点:1.只能存储同一种数据类型的数据。2.一旦初始化,长度固定。3.数组中的元素与元素之间的内存地址是连续的。注意:Object类型的数组可以存储任意类型的数据。需求:收集我们班同学的兴趣爱好。数组存储兴趣爱好:String[]arr=newString[1000];*/publicclassDemo1{publicstaticvoidmain(String[]args){Object[]arr=newObject[10];arr[1]=abc;arr[2]='a';arr[3]=12;}}packagecn.itcast.collection;importjava.util.ArrayList;importjava.util.Collection;/*集合:集合是存储对象数据的集合容器。集合比数组的优势:1.集合可以存储任意类型的对象数据,数组只能存储同一种数据类型的数据。2.集合的长度是会发生变化的,数组的长度是固定的。-------|Collection单例集合的跟接口。----------|List如果是实现了List接口的集合类,具备的特点:有序,可重复。----------|Set如果是实现了Set接口的集合类,具备特点:无序,不可重复。Collection接口中的方法:增加add(Ee)添加成功返回true,添加失败返回false.addAll(Collectionc)把一个集合的元素添加到另外一个集合中去。删除clear()remove(Objecto)removeAll(Collectionc)retainAll(Collectionc)查看size()判断isEmpty()contains(Objecto)containsAll(Collection?c)迭代toArray()iterator()*/publicclassDemo2{publicstaticvoidmain(String[]args){Collectionc=newArrayList();c.add(令计划);c.add(徐才厚);c.add(周永康);System.out.println(添加成功吗?+c.add(郭美美));//创建集合Collectionc2=newArrayList();c2.add(徐才厚);c2.add(郭美美);c2.add(狗娃);/*c.addAll(c2);//把c2的元素的添加到c集合中去。*//*删除方法:c.clear();//clear()清空集合中的元素System.out.println(删除成功吗?+c.remove(美美));//remove指定集合中的元素删除,删除成功返回true,删除失败返回false.c.removeAll(c2);//删除c集合中与c2的交集元素。c.retainAll(c2);//保留c集合与c2的交集元素,其他的元素一并删除。*/System.out.println(查看元素个数:+c.size());System.out.println(集合的元素:+c);}}packagecn.itcast.collection;importjava.util.ArrayList;importjava.util.Collection;/*判断isEmpty()contains(Objecto)containsAll(Collection?c)*/classPerson{intid;Stringname;publicPerson(intid,Stringname){this.id=id;this.name=name;}@OverridepublicStringtoString(){return{编号:+this.id+姓名:+this.name+};}@Overridepublicbooleanequals(Objectobj){Personp=(Person)obj;returnthis.id==p.id;}//java规范:一般重写equlas方法我们都会重写hashCode方法的。@OverridepublicinthashCode(){returnthis.id;}}classDog{}publicclassDemo3{publicstaticvoidmain(String[]args){/*Collectionc=newArrayList();c.add(令计划);c.add(徐才厚);c.add(周永康);System.out.println(判断集合是否为空元素:+c.isEmpty());System.out.println(判断集合中是否存在指定的元素:+c.contains(薄熙来));*///集合添加自定义的元素Collectionc=newArrayList();c.add(newPerson(110,狗娃));c.add(newPerson(119,狗剩));c.add(newPerson(120,铁蛋));Collectionc2=newArrayList();c2.add(newPerson(110,狗娃));c2.add(newPerson(119,狗剩));c2.add(newPerson(104,陈狗剩));System.out.println(c集合有包含c2集合中的所有元素吗?+c.containsAll(c2));//如果在现实生活中,只要身份证编号一致,那么就为同一个人。System.out.println(存在该元素吗?+c.contains(newPerson(120,陈铁蛋)));//其实contains方法内部是依赖于equals方法进行比较的。System.out.println(集合的元素:+c);}}packagecn.itcast.collection;importjava.util.ArrayList;importjava.util.Arrays;importjava.util.Collection;/*迭代toArray()*/publicclassDemo4{publicstaticvoidmain(String[]args){/*Collectionc=newArrayList();c.add(令计划);c.add(徐才厚);c.add(周永康);Object[]arr=c.toArray();//把集合中的元素全部存储到一个Object的数组中返回。System.out.println(数组的元素:+Arrays.toString(arr));*/Collectionc=newArrayList();c.add(newPerson(110,狗娃));c.add(newPerson(119,狗剩));c.add(newPerson(120,铁蛋));Object[]arr=c.toArray();//需求:把编号是110的人信息输出。for(inti=0;iarr.length;i++){Personp=(Person)arr[i];//从Object数组中取出的元素只能使用Object类型声明变量接收,如果需要其他的类型需要进行强制类型转换。if(p.id==110){System.out.println(p);}}}}packagecn.itcast.thread;/*进程:进程就是正在运行的应用程序。进程了负责了内存空间划分。线程:一个进程中的代码是由线程去执行的,线程也就是进程中一个执行路径。多线程:一个进程中有多个线程可以同时执行任务。多线程的好处:1.解决一个进程中可以同时执行多个任务的问题。2.提高了资源利用率。多线程的弊端:1.增加了cpu的负担。2.降低了一个进程中线程的执行概率。3.出现了线程安全问题。4.会引发死锁现象。自定义线程的实现方式:方式一:1.自定义一个类继承Thread类。2.重写Thread类的run方法,把自定义线程的任务代码写在run方法上。3.创建Thread的子类对象,并且调用start方法启动一个线程。注意:千万不要直接调用run方法,调用start方法的时候线程就会开启,线程一旦开启就会执行run方法中代码,如果直接调用run方法,那么就相当于调用了一个普通的方法而已。线程安全问题:线程安全出现的根本原因:1.存在两个或者两个以上的线程对象共享同一个资源。2.多线程操作共享资源的代码有多句。线程安全问题的解决方案:方式一:可以使用同步代码块去解决。格式:synchronized(锁对象){需要被同步的代码}同步代码块要注意的事项:1.锁对象可以是任意的一个对象。2.一个线程在同步代码块中sleep了,并不会释放锁对象。3.如果不存在着线程安全问题,千万不要使用同步代码块,因为会降低效率。4.锁对象必须是多线程共享的一个资源,否则锁不住。方式二:同步函数:同步函数就是使用synchronized修饰一个函数。同步函数要注意的事项:1.如果是一个非静态的同步函数的锁对象是this对象,如果是静态的同步函数的锁对象是当前函数所属的类的字节码文件(class对象)。2.同步函数的锁对象是固定的,不能由你来指定的。推荐使用:同步代码块。原因:1.同步代码块的锁对象可以由我们随意指定,方便控制。同步函数的锁对象是固定的,不能由我们来指定。2.同步代码块可以很方便控制需要被同步代码的范围,同步函数必须是整个函数的所有代码都被同步了。需求:一个银行账户5000块,两夫妻一个拿着存折,一个拿着卡,开始取钱比赛,每次只能取一千块,要求不准出现线程安全问题。*/classBankThreadextendsThread{staticintcount=5000;publicBankThread(Stringname){super(name);}@Override//publicsynchronizedvoidrun(){while(true){synchronized(锁){if(count0){System.out.println(Thread.currentThread().getName()+取走了1000块,还剩余+(count-1000)+元);count=count-1000;}else{System.out.println(取光了...);break;}}}}//静态的函数----函数所属的类的字节码文件对象---BankThread.class唯一的。publicstaticsynchronizedvoidgetMoney(){}}publicclassDemo1{publicstaticvoidmain(String[]args){//创建两个线程对象BankThreadthread1=newBankThread(老公);BankThreadthread2=newBankThread(老婆);//调用start方法开启线程取钱thread1.start();thread2.start();}}packagecn.itcast.thread;/*java中同步机制解决了线程安全问题,但是也同时引发死锁现象。死锁现象:死锁现象出现的根本原因:1.存在两个或者两个以上的线程。2.存在两个或者两个以上的共享资源。死锁现象的解决方案:没有方案。只能尽量避免发生而已。*/classDeadLockextendsThread{publicDeadLock(Stringname){super(name);}publicvoidrun(){if(张三.equals(Thread.currentThread().getName())){synchronized(遥控器){System.out.println(张三拿到了遥控器,准备去拿电池!!);synchronized(电池){System.out.println(张三拿到了遥控器与电池了,开着空调爽
本文标题:java线程生产者与消费者从基础到入门
链接地址:https://www.777doc.com/doc-1618623 .html