黑马程序员_七、多线程及String类和单例设计模式

来源:互联网 发布:阿曼西奥 奥特加 知乎 编辑:程序博客网 时间:2024/06/05 15:12

                                                                                          -------android培训java培训、期待与您交流! -------

 

 

                                     七、多线程及String类和单例设计模式

       转眼来传智已经半个月了,课程已经马上进行到集合了,我自认为集合我掌握

的还算可以吧,至少老毕视频里面还没有不理解的地方,21期马上就开班了,看到

论坛那么多熟悉的人都已经进入黑马,真羡慕啊。

       最近我发现我迷上GUI了,虽说老毕就讲了一天,现在这边的老师只要一出个

练习题,我就想着要用GUI给做出来,很有成就感哈哈,虽说代码量不多,原理也

很简单,但也都是我一点点敲出来,然后给别人测试再自己解决一些bug和问题,

慢慢改进加功能,最终实现还算满意的成品。得瑟完,总结知识点哈哈。

-----------------------------------------------------------------------------------------------------------------

一、多线程

       (1)多线程:程序有多条执行路径。
 
                进程:是由系统产生的一个应用程序的标识。真正的是表示占用了一块内存空间。
                           就是正在的运行的程序。
               
                线程:线程是进行的执行单元,执行路径。
 
                如果一个程序只有一条执行路径,就被称为单线程程序。
                如果程序的执行路径有多条执行路径,就被称为多线程程序。
 
                举例:
                         360的界面管理,迅雷下载,QQ聊天
  
                为什么要这样设计程序?
                提高效率。

       (2)实现多线程的两种方式

                第一种:继承Thread类
                              A:定义一个类ThreadDemo,继承自Thread类。
                              B:在ThreadDemo类里面重写run()方法。
                              C:在测试类中,创建ThreadDemo类的对象。
                              D:调用start()方法。

                代码如下

               

public class ThreadDemo extends Thread{public ThreadDemo(){}public ThreadDemo(String name){super(name);}public void run(){//需要被线程封装的代码for(int x=0; x<100; x++){Sysetm.out.println(getName()+" hello"+x);}}}public class ThreadDemoTest{public static void main(String[] args){ThreadDemo td1 = new ThreadDemo("张三");ThreadDemo td2 = new ThreadDemo("李四");td1.start();td2.start();}}

               第二种:实现Runnable接口
                           A:定义一个类RunnableDemo实现Runnable接口。
                           B:在RunnableDemo类里面重写run()方法。
                           C:在测试类里面创建RunnableDemo的对象。
                           D:在创建Thread类的对象,然后把RunnableDemo的对象作为构造参数传递。
                           E:通过Thread类的对象调用start()方法。
   
               为什么要把RunnableDemo的对象作为构造参数传递呢?
                           因为RunnableDemo它没有start()方法,只有Thread类有。
                           而如果你单独创建Thread类的对象使用。

                           那么,最终使用的run方法默认情况下跟我们的RunnableDemo的对象无关。
                          为了让Thread类调用run()是RunnableDemo类里面的,所以,我们把它作为参数传递。

               代码如下

              

//public static Thread currentThread():返回当前正在执行的线程对象public class RunnableDemo implements Runnable{public void run(){//需要被线程封装的代码for(int x=0; x<100; x++){Sysetm.out.println(Thread.currentThread().getName()+" hello"+x);}}}public class RunnableDemoTest{public static void main(String[] args){RunnableDemo rd = new RunnableDemo();Thread t1 = new Thread(rd,"张三");Thread t2 = new Thread(rd,"李四");t1.start();t2.start();}}

               两种方式的区别?
                      A:继承Thread类有局限性。
                      B:而实现接口Runnable避免了局限性。

       (面试题)run()和start()的区别?

               run()里面封装的是线程执行的代码,如果直接调用,是普通方法调用。
               start()做了两件事情:启动了线程,调用了run()方法。

       (3)jvm的启动是否是多线程的?

               是, 该进程中至少一个线程负责java程序的执行。而且这个线程运行的代码存在于main方法中。该线程称之为主线程。

               jvm启动不止一个线程,还有负责垃圾回收机制的线程。

       (4)线程的随机性及线程的生命周期图。请参照图解。

               随机性:cup同一时刻只能执行一个程序只是在做着快速的切换,
                            而同一时刻执行的程序又不确定,导致了线程的随机性

               线程的生命周期图及特点:

              

              每个阶段的特点:

                     新建(创建线程)
                     就绪(线程准备就绪,要么具备执行,要么不具备执行权)
                     运行(抢到CPU资源,具有执行资格,执行程序,执行过程中可能失去CPU资源,或者执行了wait()、sleep()
                              进入阻塞状态,释放执行资格,就不具备执行资格,进入就绪状态等待)
                     消失(run()方法代码执行完毕,或者执行了stop(),线程对象成为垃圾,消失)

       (5)线程安全问题

              问题的原因:

                     当多条语句在操作同一个线程共享数据时,一个线程对多条语句只执行了一部分,

                     还没有执行完,另一个线程参与进来执行。导致共享数据的错误。

              解决办法:对多条操作共享数据的语句,只能让一个线程都执行完。在执行过程中,其他线程不可以参与执行。

              判断程序有没有线程安全问题

                     在程序有共享数据
                     多条语句操作共享数据
                     多个线程访问

              Java对于多线程的安全问题提供了专业的解决方式。

              A:就是同步代码块。

              synchronized(对象)

              {

                     需要被同步的代码

              }

              对象如同锁。持有锁的线程可以在同步中执行。没有持有锁的线程即使获取cpu的执行权,也进不去,因为没有获取锁。

              B:同步方法
              在方法修饰用synchronized关键字。

              锁对象:this

              C:静态同步方法
              锁对象:当前类的Class文件对象。

二、单例设计模式

              设计模式:把一些常见的解决问题的思想,思路组合成一个模板供我们使用。23种设计模式。
                                易学设计模式,GOF设计模式,严闳(设计模式)

              23种设计模式:
                               创建型模式:就是为了创建对象而存在。单例,工厂,原型...
                               结构型模式:对象与对象间的关系。代理设计模式...
                               行为型模式:对象的行为。只有对象本身的功能设计的良好,才能让对象间的合作高效。观察者模式,迭代器模式...

              单例设计模式:
                               要保证类在内存中只有一个对象。

              想要保证对象唯一。

              1,为了避免其他程序过多建立该类对象。先禁止其他程序建立该类对象

              2,还为了让其他程序可以访问到该类对象,只好在本类中,自定义一个对象。

              3,为了方便其他程序对自定义对象的访问,可以对外提供一些访问方式。

              饿汉式:           

//Single类一进内存,就已经创建好了对象。class Single{private static Single s = new Single();private Single(){}public static Single getInstance(){return s;}}


              懒汉式:             

//对象是方法被调用时,才初始化,也叫做对象的延时加载。成为:懒汉式。//Single类进内存,对象还没有存在,只有调用了getInstance方法时,才建立对象。class Single{private static Single s = null;private Single(){}public static Single getInstance(){if(s==null){synchronized(Single.class)//因为懒汉式多线程时会有可能有问题所有加上一个同步代码块{if(s==null)//再判断一次是减少判断次数,提高效率s = new Single();}}return s;}}//记录原则:定义单例,建议使用饿汉式。

 

三、String类

       字符串:有多个字符组成的一串数据。在java中为了方便对其操作,提供了一个类String供我们使用。

       构造方法:

                     A:String():空参数构造
                     B:String(byte[] bytes):使用字节数组组成一个字符串。
                     C:String(byte[] bytes, int offset, int length):使用字节数组的一部分组成一个字符串。
                     D:String(char[] value):使用字符数组组成一个字符串。
                     E:String(char[] value, int offset, int count):使用字符数组的一部分组成一个字符串。
                     F:String(String str):把字符串常量组成字符串对象
                     G:第七种是直接赋值使用。
       (1)String的特点:

                特点:一旦初始化,就不能被改变

                直接赋值就从字符串常量池里查找数据,如没有就创建,而new是在堆内存中创建

                例:String s = "hello";       s可以改变,s里面的值不会被改变。

       (2)面试题

                String s1 = new String("abc");
                String s2 = "abc";
                有区别吗?
                有区别。
                在s1的建立过程中,有2个对象,s1一个,"abc"本身是一个。
                在s2的建立过程中,有1个对象。

       (3)String类的判断功能:

                boolean equals(Object obj):比较字符串的内容是否相同,区分大小写
                boolean equalsIgnoreCase(String str):比较字符串的内容是否相同,不区分大小写
                boolean contains(String str):判断字符串对象是否包含一个串
                boolean startsWith(String str):判断某个字符串是否以指定的内容开头
                boolean endsWith(String str):判断某个字符串是否以指定的内容结尾
                boolean isEmpty():判断字符串是否为空

       (4)获取功能

                int length():字符串的长度
                char charAt(int index):根据索引返回对应的字符
                int indexOf(int ch):返回指定的字符在字符串中第一次出现的索引
                int indexOf(String str):返回指定的字符串在字符串中第一次出现的索引
                int indexOf(int ch,int fromIndex):从指定的索引开始返回指定的字符在字符串中第一次出现的索引
                int indexOf(String str,int fromIndex):从指定的索引开始返回指定的字符串在字符串中第一次出现的索引
                String substring(int start):从指定的索引开始截取字符串。默认到结尾。
                String substring(int start,int end):从指定的位置开始,到指定的位置结束,截取字符串

       (5)转换功能

                byte[] getBytes():通过字符串得到一个字节数组
                char[] toCharArray():通过字符串得到一个字符数组
                static String copyValueOf(char[] chs):把字符数组变成字符串
                static String valueOf(char[] chs):把字符数组变成字符串
                static String valueOf(int i)基本类型:把任意类型转成字符串
                String toLowerCase():转成小写
                String toUpperCase():转成大写
                String concat(String str):字符串的连接

       (6)String类的其他功能

                替换功能:
                        String replace(char old,char new)
                        String replace(String old,String new)
 
                切割 String[] split(String regex)
  
                去除字符串两端空格 String trim()
  
                按字典顺序比较两个字符串  
                        int compareTo(String str)
                        int compareToIgnoreCase(String str)

总结:掌握多线程及特点和什么时候使用

           单例模式的原理

           String类的灵活使用

           最后老师教了eclipse的debug调试,目前正在熟习中。

                                                                                                         -------android培训java培训、期待与您交流! -------

原创粉丝点击