黑马程序员_七、多线程及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培训、期待与您交流! -------
- 黑马程序员_七、多线程及String类和单例设计模式
- 黑马程序员_多线程的死锁和多线程下的单例设计模式
- 黑马程序员_单例设计模式&多线程
- 黑马程序员_多线程及单例模式
- 黑马程序员_多线程及单例模式
- 黑马程序员_静态及单例设计模式
- 黑马程序员_单例和享元设计模式
- 黑马程序员_单例设计模式和装饰类设计模式
- 黑马程序员_单例设计模式
- 黑马程序员_单例设计模式
- 黑马程序员_单例设计模式
- 黑马程序员_单例设计模式
- 黑马程序员_单例设计模式
- 黑马程序员_单例设计模式
- 黑马程序员_单例设计模式
- 黑马程序员_单例设计模式
- 黑马程序员_单例设计模式
- 黑马程序员_单例设计模式
- 收不到组播问题 rp_filter
- 从数据取出的数据和某个常量比较的注意点
- mongoDB安装使用
- VC编写DLL几种方法的简介
- 每个程序员都应该了解的内存知识(二)
- 黑马程序员_七、多线程及String类和单例设计模式
- HotSpot 虚拟机对象的创建过和对象的内存结构
- windows下cvs服务器安装配置
- 使用SQL语句获得服务器名称和IP 地址
- 绕开AS3安全沙箱,跨域加载SWF
- 九之再续:教你一步一步用c语言实现sift算法、上
- Image I/O编程指南
- java中获取实体类中的get、set方法名
- 代码规范总结