多线程(Thread)
构造方法
1.新建一个MyThread(名字随便起)类,并实现Thread类,再在主方法中创建MyTread类的对象,一个MyTread对象即为一个线程
2.新建一个MyRunnable(名字随便起)类并实现Runnable类,再创建MyRunnable对象,再创建Thread类的对象并传入刚刚新建的MyRunnable对象,一个Thread对象即为一个线程
注意:为了更直观地分辨各个线程,一般在创建新线程后,使用setName()来设置其名称;;或者在创建对象时传入名称new Thread(Runnable对象,要创建的Threa的名字)
getName()为获取该线程名称的方法
每个线程都会有一个run()方法,相当于在创建新的线程的时候领取一份,所以,各个线程并非同时使用一个run()方法,而是每个线程都有一个相同的run()方法
在多线程中,多个线程往往会共享相同的数据。Cup在执行多线程的时候,是在不同线程之间高速切换来实现的,所以,多个线程在同时使用同一个数据时,往往出现问题,比如火车站卖票的例子中,有时候会出现卖出了负数张票,或者一张票多次卖出的情况
为了解决多线程操作共享数据时出现的问题,需要使用同步代码块来对程序进行约束,即synchronized(锁对象) 。
同步代码块的使用格式:Synchronized(锁对象) {//需要同步的代码块(会出现冲突的代码)}。锁对象需是一个这样的对象:多个线程同时拥有的对象
同步代码块:安全性高,效率低; 非同步代码块:安全性低,效率高
同步代码块的注意事项:
重点是要理清要同步的代码部分,在什么地方开始“锁起来”
所对象一定是所有冲突线程所共有的,通常使用其Class对象
面向网络编程
网络通讯的三要素 : 协议,IP地址,端口
InetAddress类 : 静态方法:getByName(String host)根据主机名获得其IP getLocalHost()获取本主机的IP地址
非静态方法:getHostName()获取主机名
getHostAddress()获取IP地址
UDP协议
UDP协议:占用的资源小,通信效率高,但是容易丢包,因为其相当于广播,只发送,不管对方能不能接收到
TCP协议:通信之前,首先判断通信双方是否能正常通信,建立一个可靠的连接之后才 进行数据的传输,因而效率比较低
UDP协议传输数据,要创建DatagramPacket对象,数据包,用来装要发送的数据,(打包发送)
构造方法:DatagramPacket(byte[] buf, int length)接收端用于接收长度为length的数据包
DatagramPacket(byte[] buf, int length, InetAddress address, int port)发送端用 来将长度为length的数据包发送到地址address的port端口上
DatagramPacket类的方法,用于从数据包中获取各项需要知道的信息
getAddress() getPort()
getData()获取数据包中的byte数组 getLength()获取数据包的长度(int)
DatagramPacket数据包(要收发的东西)
DatagramSocket发送或接收对象(用它收发东西,发的东西里本来就有地址和端口,接 收对象本来就指定了在哪个端口接收)
TCP协议
客户端需要创建Socket对象,用于发送;服务端需要创建ServerSocket对象用于接收;
服务器在接收数据时,使用accept()方法获取到的是服务端对象Socket;
当客户端与服务端建立连接后,数据是以IO流的形式进行交互的
创建接收端ServerSocket对象,用accept()方法获取Socket对象,获取字符输入流对象,创建用于接收字节的数组byte[],解析数据,用Socket对对象来获取InetAddress
##模拟用户登录的案例##
反射
得到某个类的字节码对象,进而得到这个类所有属性和方法,并调用
获得字节码对象的方式
1.对象.getClass() 2.类名.class
3.调用Class类的forName()方法:Class.forName(类的全名包名+类名)
反射获取构造方法
Class对象调用getConstructors() 获取全部构造方法,返回数组形式
getConstructor()传入参数时获取对应的构造
Object obj = c.newInstance("lisi",30);用得到的构造方法创建对象,返回Object
可以直接用Class.newInstance(),但是只能通过空参方法创建
getFields() 获取所有public修饰的成员变量
getDeclaredFields() 获取包括私有权限在内的所有成员变量
反射操作私有成员时,用getDeclared....方法获取私有字段,再通过setAccessilbe让虚拟机不检查权限,达到操作私有成员的目的
getMethod()获取成员方法,用成员方法对象调用invoke()来运行方法
若要获取特定的成员方法,可在方法后的小括号内传入字符串形式的方法名,如果这个方法需要传入参数,用“,”隔开,传入参数类型的.class
私有方法同样使用setAccessible(true)来接触权限限制
BeanUtils
Static void setProperty(Object bean,String name,Object value) bean:要设置哪个对象的属性
name:要设置的属性名称 value需要修改成的具体元素,要改成什么就传入什么
Static String getProperty(Object bean,String name)
Static void populate(Object bean,Map properties)使用此命令直接将Map对象中的属性 赋值给对象,如果有未找到的键,自动跳过,不会报错
自定义BeanUtils
注意:在定义方法过程中,使用setAccessible(true)来绕过权限,使方法能用于获取和修 改所有权限的属性,保证方法的可使用性更好
在编写populate()方法时,使用try...catch(){}语句捕获属性找不到的错误,使方法的适用 性更友好
页面信息的显示
<font>----字体
<color>
<size>
排版标签
标题
<h1>----一级标题
<h2>----二级标题
...
<h6>----六级标题
段落
<p></p>
字体加粗倾斜下划线
<b></b> <i></i> <u></u> 同office软件
居中标签
<center></center>
分割线
<hr/>
html导入图片
*标签
<img />
*属性
*src :图片的来源.
*width :图片的宽度.
*height:图片的高度.
*alt :图片找不到显示的内容.
*图片路径
* ../上一层目录
* 直接写,为当前目录
网站列表页面的显示
列表标签
有序列表
<ol>
<li>要显示的东西</li>
</ol>
type属性
*disc :实心点.
*circle :空心圆(点).
*square :方块.
无序列表
<ul>
<li></li>
</ul>
type属性:
* 1 :数字类型
* a :英文类型
* i :罗马字符序号
*start属性:从哪里开始
超链接标签
<a></a>
属性:
href :链接的路径
target :打开的方式
*_self :在自身页面打开
*_blank :在新窗口中打开
*_parent
表格标签
<table>----表格
<tr>----行
<td></td>----列
<td></td>
</tr>
</table>
表格的属性
width :表格的宽度(只要设置其中一行的宽度,其他行的宽度都变)
height :表格的高度
border :表格的边框
align :表格的水平位置:
*left
*center
*right
cellspacing:设置表格行之间的行距
bgcolor:设置表格的底色
<td>的属性
*colspan="列数"
*rowspan="行数"
表单标签
<form></form>
常用属性:
*action属性:提交的路径,默认提交到当前页面
*method属性:请求的方式:GET 和 POST、默认是GET.
***** GET 和 POST 方式的区别:
*GET :数据会显示到地址栏中.GET方式提交的是有大小限制
*POST :数据不会显示到地址栏中.POST方式提交的是没有大小限制.
表单元素
*<input type="text"> :文本框.
*常用属性:
*name :表单元素的名称,必须有name属性,然后后台才可以接收数据
*value :文本框的默认值
*size :文本框的长度
*maxlength:文本框输入的最大长度
*readonly:只读文本框
*<input password> :密码框
*常用属性:
*name :表单元素的名称,必须有name属性,然后后台猜可以接收数据
*value :密码框的默认值
*size :密码框的长度
*maxlength:密码框的最大输入长度
*<input type="radio"> :单选按钮
*常用属性:
*name :表单元素名称,必须有name属性,然后后台才可以接收数据
*value :单选按钮的默认值(传到后台的数据值)
*checked:单选按钮默认被选中
*<input type="checkbox"> :复选按钮
*常用属性:
*name :表单元素的名称,必须有name属性,然后后台才可以接收数据
*value :单选按钮的默认值
*checked:单选按钮默认被选中
*<input type="button" value="按钮上的字"> :普通按钮,没有任何功能的按钮
*<input type="submit" value="按钮上的字"> :提交按钮
*<input type="reset"> :重置按钮
*<input type="file"> :文件上传的表单项
*<input type="hidden"> :隐藏字段
*<input type="image"> :图片按钮
*<select name="">
<option value="提交到后台的数据的值"></option>
</select>:下拉列表
*<textatea>:文本域
*<input type="email"> :限定输入的文本为邮箱
*<input type="date"> :表单项弹出小日历
*<input type="number"> :表单项为数字选择或输入数字
*<input type="color"> :表单项为颜色
框架标签
<frameset>,标签与body标签是冲突,有frameset就可以没有body
*属性:
*rows
*cols
使用<frame>标签,frame代表切分的每个部分
特殊字符标签
*空格 :
*< : <
*> : > |
|