本帖最后由 小石姐姐 于 2018-4-24 17:18 编辑
JAVA多线程 进程:正在进行的程序,一个应用程序在内存中的执行区域,一个进程至少要有一个线程
线程:进程中的一个负责程序执行的控制单元(执行路径),一个进程中可以多执行路径,称为多线程
单线程特点:安全性高,效率低
多线程特点:安全性低,效率高。本质为CPU处理器在多个线程之间快速切换 ,达到同时运行的效果
java创建线程的方式
1、定义一个类 继承 Thread类,重写父类的run()方法
启动执行线程,Java虚拟机调用该线程的run方法
该类对象.start()
2、定义一个类 实现 Runable接口,重写接口的run()方法。(常用)
new Thread(该类对象).start() //执行线程
好处:将线程的任务从线程的子类中分离出来,进行单独封装。避免java单继承局限性
3、线程池(thread pool),存放Thread对象的池子
1. 定义类 实现 Callable接口,重写call() 方法(返回结果为传入的泛型)。传入线程池执行
2. 定义类 实现 Runnable接口,重写run() 方法。传入线程池执行
Thread 类
--构造方法
(Runable target) 通过Runable对象那个创建Thread对象
(Runable target,String threadName) 指定线程名
--静态成员
sleep(long millis) //指定时间内睡眠,时间结束后继续执行。不释放锁。可能抛 InterruptedException
Thread currentThread() //返回当前运行线程的引用
yield() //暂停一下当前执行线程对象,释放执行权
--成员方法
run() //用于子类重写,表示该线程要执行的任务,不能直接调用
start() //执行线程
setName() //修改线程名称
String getName()//返回线程的名称
setDacmon(true) //将该线程标记为守护线程或用户线程,成为后台线程,不会因为前台线程结束而消失
join() //临时加入一个线程运算时可以用,哪个线程执行到该方法哪个线程等待该线程终止。可能抛出中断异常
toString() //返回 线程名、优先级1-10越高越优、线程组
setPriority(MAX_PRIORITY) //设置优先级,默认为5
结束线程
控制run方法任务结束,控制循环,定义标记,如果线程处于冻结状态,无法读取
interrupt() //将线程从冻结状态强制恢复到运行状态中来,让线程具备cpu执行资格,但会抛出中断异常 InterruptedException
Executors 类
静态方法
ExecutorService newCachedThreadPool() //创建一个新线程池,为每个新传入的任务创建一个线程
ExecutorService newFixedThreadPool(int nThreads) //创建一个固定数量的线程池(常用)
ExecutorService newSingleThreadExecutor() //创建只有一个线程的线程池
ExecutorService 类
Future<T> submit(Callable<T> task) 提交线程并执行, 返回结果
Future<T> submit(Runnable task) 同上, 只是参数不同
Future<T> submit(Runnable task,T) 传入任意类型结果,不传则返回的是null
shutdown() 通知线程执行完任务后关闭. 注意该方法不会在调用时立刻停止线程, 而是让线程执行完任务后停止. 如果不调用此方法, 则线程任务执行完后仍然在运行
Future
get() //返回结果
线程安全问题
出现原因:多个线程并发的访问共享的数据
同步:安全性高,效率低;非同步:效率高,安全性低
解决1、同步代码块。建议使用,锁对象需要被所有的线程共享,保证对象引用是同一个
synchronized(锁对象){ 操作共享数据的代码 }
解决2、同步方法。此方法只可同时被一个吸线程执行
synchronized修饰方法。
非静态同步方法锁对象为this
静态同步方法锁对象为当前类的字节码对象
解决3:
Lock l=new ReentrantLock(); //创建锁对象,替代了synchronized关键字
l.lock(); //获取锁
try{code...}finally{l.unlock();} //释放锁
Condition l.newCondition(); //通过已有锁获取该锁上的监视器对象,可创多个
await(); //冻结线程
signal(); //唤醒线程池中一个线程
signalAll();//唤醒线程池中所有线程
Condition //替代了Object监视器方法的使用
死锁(deadlock)同步代码块中的线程不出来, 也不释放锁; 同步代码块外的线程拿不到锁, 只能等在外面
发生死锁的原因:
1. 同步代码块内的线程, 可能处在死循环, IO阻塞, sleep()状态, 导致内部持有锁的线程无法出同步代码块
2. 多个线程互相持有锁又不释放锁: 两个线程执行的任务都是双层同步代码块, 每层同步都需要一个锁, 两个线程中同步代码块的锁是相反的
线程的声明周期中有5种状态
1. 创建: new一个线程对象, 此时还没有调用start()
2. 就绪: 调用start()方法后, 进入就绪状态, 等待CPU执行
3. 运行: 获取了CPU的执行权, 开始运行线程。
4. 阻塞: (冻结)调用了sleep(), wait(),或由于IO操作导致阻塞. 阻塞解除后仍会返回就绪状态, 等待CPU执行
5. 销毁: (消亡)线程执行完毕。
线程间通讯
线程释放锁的3种情况
1. synchronized同步代码执行完毕
2. 线程发生了异常导致线程终止
3. 线程调用了 wait() 方法进行等待, 等待会立刻释放锁
等待/唤醒机制。锁对象就是监视器
Object 类。这些方法用于锁对象调用
wait() //使当前线程等待状态。释放执行权,立刻释放锁。可能抛 InterruptedException。让线程处于冻结状态,线程会被存储到锁的线程池中。
notify() //随机唤醒此对象监视器上等待状态的线程
notifyAll() //唤醒此对象监视器上等待状态的所有线程
都必须定义在同步中,因为这些方法是用于操作线程状态的方法,必须明确操作的是哪个锁上的线程
网络编程 网络编程:又称Socket(套接字)编程
Socket (套接字)不是协议, 而是对协议的封装, 提供了编程规范接口, 让程序员可以通过它来实现相关网络协议
用于描述IP地址和端口. 是一种网络编程机制. 通信两端都有Socket
计算机上一般会有多个服务程序, 每个服务程序会使用多个Socket进行网络通信, 每个Socket会绑定到一个端口上, 网络通信就是Socket之间的通信, 数据在两个Socket之间通过IO流传输。
|--操作IP地址的类
InetAddress 类。IP地址,可包含相应主机名。无构造函数
静态方法
InetAddress getLocalHost() //获取本地主机IP对象
InetAddress getByName(String host) //通过主机名 获取IP地址
InetAddress[] getAllByName(String host) //通过主机名 获取IP地址。因为可能出现服务器集群,返回IP不唯一。
InetAddress getByAddress(byte[] addr) //根据IP获取InetAddress对象
InetAddress getLoopbackAddress() //获取回环地址的InetAddress对象. 即 127.0.0.1 或localhost
String getHostAddress() //获取IP地址字符串表示形式
String getHostName() //获取主机名称。没有返回主机地址
byte[] getAddress() //获取对象原始IP地址
|--UDP传输
步骤:建立发送端、接收端、数据包;调用Socket发送接收方法;关闭Socket;发送端与接收端是两个独立的运行程序。
DatagramSocket 类 //发送和接收数据报包的套接字。基于UDP协议的Socket。随机分配端口号。
(int port) //指定端口号,如果被占用可能抛BindException 端口号已经被绑定异常
send(DatagramPacket p) //发送数据包。从此套接字发送数据报包
receive(DatagramPacket p) //接收数据包。阻塞方法。从此套接字接收数据报包
close() //关闭Socket通信,释放资源
DatagramPacket 类 //UDP数据包
发送
(byte[],int len,InetAddress,int port) //构造数据包,用来将指定长度的包发送到指定主机上的指定端口号
接收,获取数据
(byte[],int len) //构造接收指定长度的数据包
InetAddress getAddress() //获取发送端IP对象
byte[] getData() //获取接收到的数据,也可以使用创建包对象时的数组
int getLength() //获取具体接收到的数据长度,字节个数
int getPort() //获取发送端的DatagramSocket端口号
|--TCP传输
过程:建立客户端和服务器端,通过Socket中的IO流进行数据传输。关闭socket。客户端与服务器端是两个独立的应用程序。
客户端建立,发送数据
1、创建TCP客户端socket服务。使用Socket对象。指定明确其目的地、要连接的主机
2、如果连接成功,说明数据传输通道以建立。该通道是socket流
3、使用输出流,将数据写出
4、关闭资源
Socket 类 客户端。套接字是两台机器间通信的端点。
(InetAddress,int port) //创建一个流套接字并将其连接到指定IP指定端口。
(String host,int port) //创建一个流套接字并将其连接到指定主机上指定端口。
发送,写入
OutputStream getOutputStream() //返回此套接字的输出流
shutdownInput() //输入结束标记。
接收,读取
InputStream getInputStream() //返回此套接字的输入流
InetAddress getInetAddress() //获取发送端IP对象
其他
close() //关闭连接,包括关闭流
建立服务端,接收数据
创建服务端Socket对象,通过ServerSocket对象
服务端必须对外提供一个端口,否则客户端无法连接
监听(阻塞),获取链接过来的客户端对象,
用客户端对象的socket流读取客户端发来的数据
关闭资源。关客户端,关服务端
ServerSocket(int port) 类。 服务端。创建客户端对象,指定端口号
Socket accept() //监听数据,阻塞。获取客户端对象,通过获取IO流交互数据
close() //关闭
反射 ——反射(reflect)。在程序运行时,动态获取类中信息,就是java反射
作用:在运行时,可以获取并调用任意一个类的所有方法和属性,反射可以在不修改源代码前提下,改变程序的运行方式;
反射使后期web框架的底层实现基础
前提:获取类的对象(Class<T> )
1、对象名.getClass()
2、类名.class
3、Class.forName("全类名")
Class<T> 类。描述字节码文件的类
静态方法
Class<?> forName(String 全类名) //获取class字节码文件对象
String getName() //返回全类名
创建类的无参实例
T newInstance(); //返回字节码文件类对应空参数的新实例
获取构造
Constructor<?>[] getConstructors() //获取所有public的构造函数对象,没有返回数组长度为0
Constructor<?>[] getDeclaredConstructors() //获取所有权限的构造函数对象,如果该类是接口,基本类型,数组,void 则返回数组长度为0
Constructor<T> getConstructor(Class<?>... parameterTypes) //根据指定参数获取public构造函数对象。需传入类型的字节码Class对象。如:(String.class,int.class)
Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes) //根据指定参数获取所有权限构造函数对象。
获取变量字段
Field[] getFields() //获取所有public字段对象
Field[] getDeclaredFields() //获取所有权限字段对象。
Field getField(String fieldName) //根据字段名称获取public的字段对象
Field getDeclaredField(String fieldName) //根据字段名称获取任意权限的字段对象
获取方法对象
Method[] getMethods() //获取所有public的方法
Method[] getDeclaredMethods() //获取所有任意权限的方法
Method getMethod(String name,Class... parameterTypes) //获取指定方法名的public方法,可以明确参数类型
Method getDeclaredMethod(String name,Class... parameterTypes) //获取指定方法名的任意权限方法,可以明确参数类型
注意:
方法名中包含Declared:可以获取任意权限的成员
对于 private修饰的 变量|方法 只能获取,不可访问和修改,可以取消java访问检查
方法名中不包含Declared:只能获取public修饰的成员
Constructor<T> //构造函数对象
T newInstance(Object... initargs) //指定参数创建实例,传入参数必须根指定的构造函数对象一致。否则抛异常
Field //字段对象。通过此对象修改(覆盖)指定对象的字段值
Object get(Object obj) //获取指定对象字段值
set(Object obj,Object value) //设置指定对象字段值
Method //方法对象
Object invoke(Object obj,Object... args) //调用指定方法名[指定参数]的方法运行,没有返回值,返回null
HTML ——概述
HTML(Hyper Text Markup Language) 超文本标记语言。
标记语言:通过一组标签形式描述事物的一门语言
超文本:比普通文本更强大
作用:制作页面(静态页面),数据显示的描述。
——语法
HTML文件后缀:.html|.htm
书写规则:
标签必须用<>引起来,已经定义好的标签
属性 key="value" (建议属性值用双引号引起来)
不区分大小写
元素通用属性
class 元素类名
id 元素唯一ID
style 元素样式
title 元素额外信息
常见属性
color:字体颜色
颜色取值
1.#xxxxxx|#xxx(x为3个16进制数,RGB,光的三原色)
2.英文单词
align:对齐方式 left|right|center
width="" 像素:1px 百分比:20%
height=""
border="px" 边框
bgcolor 背景颜色
路径写法
相对路径:
./ 或者 什么都不写 当前目录
../ 上一级目录
绝对路径:
http://www.b.com 带协议的绝对路径
<!-- 注释内容 -->
//版本声明
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> //html4标准
<!doctype html> //html5标准
<html> //根标签
xmlns="http://url"默认命名空间
<head lang="en"> //头标签,头部分,语言
<meta> 元信息标签
charset //指定浏览器用什么编码打开此页面(默认UTF-8) big5繁体中文
name //网页的描述信息。当取keywords时,content属性内容作为搜索引擎关键字搜索
http-equiv="Content-Type" //模拟http协议的响应消息头
如:<meta http-equiv="refresh" content="3;url=http://www.baidu.com" /> //表示打开此页面三秒后打开百度
<title>标题</title>
<base>
href //指定网页中所有超链接的目录,结尾处/表示
target //指定所有超链接打开方式,如_blank
<link> 资源引用
rel="stylesheet" //描述目标文件与当前文档的关系,外部样式表
type="text/css" //文档类型
media //指定目标文档在哪种设备上起作用
如:<link rel="stylesheet" type="text/css" media="screen,print" href=".css">
<style type="text/css"> 定义样式,引入文档类型
</head>
<body> 体标签 </body>
</html>
——体标签
<font>文字</font> //字体标签
face="黑体"(字体样式)
size="(1-7字号)"
排版标签
<h1>...<h6> //标题标签。换行,留白,加粗
<p> //段落标签,前后空行
<hr/> //水平分隔线
<br/> //换行
<center> //内容居中显示
<b> 粗体|<i>斜体|<u>下划线
<big>大号字|<small>小号字|<ins>插入字
<sup>上标|<sub>下标
<del>|<s> //删除线,更具语义化
cite 删除原因
datetime 删除时间
<em> //强调
<strong> //重点强调,加粗
<img src="图片源"/> //图片标签
alt="" 图片找不到显示此内容
title="" 鼠标移上显示此内容
usemap="#Map"
<map> //图片部分加链接,可加多个区域
<area shape="rect" coords="50,59,116,104" href="" />
//列表标签
<ol> //有序列表。默认1.2.3.
type="1" 默认。(a,A,i 罗马字符,I 大写罗马字符)
start="10" 从10开始
<li> //列表项,缩进
<ul> //无序列表。
type="disc" //默认,实心原点(circle空心原点,square实心正方形)
<li> //缩进
<dl> //自定义列表。
<dt> //上层项目标签。
<dd>//缩进
//超链接。链接资源
<a></a>
href="" //""默认指向当前文件目录。如果不指定任何协议,按照默认协议file://解析。#表示当前页面
javascript:void(0) //javascript协议解析,取消超链接的默认点击效果
mailto:邮件地址 //找邮件程序解析,调用本机发邮件工具
thunder://路径加密 //迅雷自定义协议,对路径加密,点击后去注册表查找相关程序并解密打开地址下载资源
图片路径 //点开后显示图片
target="_self" //默认,当前页面打开
_blank 新页面打开
_parent 对于iframe在父页面打开
_top 对于iframe在最父级页面打开
框架名 打开到指定框架显示
<a name=top></a> //定位标记,锚。定义一个位置
<a href="#top"></a> //回到定义的位置
//表格
<table> //表格
cellpadding 文字边距
cellspacing 单元格间距
<tbody> //不定义也存在,可省略
<caption> //表格标题,居中
<tr> //行
<th> //表头单元格,加粗居中
<td> //单元格
colspan="" //占的列数,跨列合并
rowspan="" //占的行数,跨行合并
//表单标签
<form>
action="url?name=chen" //指定提交路径并且get提交数据,不写默认提交到本页面
method="get|post" //提交方式,默认get,不只有这两种
enctype="application/..." 以键值对的形式发送请求报文
multipart/... 用于传送文件流
<input /> 表单输入
type="text" //文本框 属性maxlength
password//密码框
radio //单选按钮,需指定value属性用于提交
checkbox//多选按钮,需指定value属性用于提交。如果name一样,会提交多个
button //普通按钮。无任何功能
reset //重置按钮。还原表单初始状态
submit //提交按钮。
file //文件框。value返回选择文件的路径
hidden //隐藏字段。页面上不显示,但会提交到服务器
image //图片提交按钮,图片作为按钮
src="图片路径"
name
必须有name属性才可以提交至服务器
可以将几个单选框(复选框)设置为一组,name属性相同即可
value="" //文本框默认值、按钮名称
size="" //文本框的长度
maxlength="" //输入的最大长度
placeholder="" //用于文本框灰化提示内容,提示内容不会提交至服务器
disabled="disabled" //禁用此元素,不会提交
readonly="readonly" //只读文本框
<select name=""> 下拉框,需指定value属性用于提交
size="" 行数
multiple=true 成为多选列表框
<option value="">
selected="selected" //默认选中此项
<textarea name="" cols="" rows="" > 文本域
提交至服务器内容格式
URL?key=value&key2=vlaue2&...
文本框、密码框、文本域 手写内容直接传递过去
单选框、多选框 需设置value属性
下拉框 默认把选中的内容传至服务器,可设置value值传递指定值
默认值
文本框、密码框、文本域 设置value属性即可
单选框、多选框 的指定项添加属性checked="checked"
下拉框 的指定项添加selected="selected。默认第一个
get和post区别
get 数据显示在地址栏中。请求大小有限制
post 数据不会显示在地址栏中。请求大小无限制
|
|