概念: 进程,线程,主线程,用户线程,守护线程
每个线程都有独立的栈空间
创建线程的三种方式
线程的常用方法:
Thread. activeCount()
Thread. currentThread()
getName()/setName(),,
isDaemon(), setDaemon(true),
isAlive(), getId(),
getState() , NEW , RUNNABLE, WAITING, BLOCKED, TERMINATED
getPriority()/setPriority(),
Thread. sleep()
interrupt(), isInterrupted() / Thread.interrupted(),
join(),
Thread .yield()
stop()
线程同步
- 线程安全问题
- 出现了线程安全问题怎么办?
- 如何同步?
synchronized( 锁对象 ){
同步代码块
} - 线程同步的工作原理
- 线程要同步必须使用同一个锁对象, 只要使用了同一个锁对象的代码块就可以同步
- 同步方法
- 死锁
1 线程
1.1 生产者消费者设计模式
模拟企业的生产者与消费者
两个线程交替打印奇数与偶数
两个线程交替打印100个数和10个数
1.2 Timer定时器
1.3 总结遇到的线程安全的类
StringBuffer
Vector
HashTable
Collections.synchronizedXXX(XXX)
开发多线程程序,使用集合
ConcurrentHashMap<K,V>
ConcurrentSkipListMap<K,V>
ConcurrentSkipListSet
CopyOnWriteArrayList
CopyOnWriteArraySet
HashTable使用整个哈希表作为锁对象
ConcurrentHashMap<K,V>采用了分段锁协议, 默认分16段.
2 反射
2.1 概述
反射就是根据字节码文件,反射类的信息,字段/方法/构造方法等内容, 动态的创建对象/动态的调用方法的技术
反射依赖Class对象.
把所有小猫抽象为Cat类,把所有小狗抽象类Dog类, 把所有计算机抽象为Computer类, 把Dog类/Cat类/Computer类/String类等所有的类抽象为Class类. Class类描述所有类的信息
如何获得Class对象?
- 每个 类都有一个class属性,返回这个类的Class对象
- 每个对象都有一个getClass()方法,返回对象的运行时类
- Class类中有一个静态方法forName(完整类名) 返回Class对象
2.2 反射类的信息
class1.getModifiers() 类修饰符
class1.getSimpleName() 简易类名
class1.getSuperClass() 父类
class1.getInterfaces() 接口
2.3 反射类的内容
字段Field
class1.getDeclaredFields() 所有字段
class1.getField( 字段名 ) 指定名称的公共字段
class1.getDeclaredField( 字段名 ) 指定名称的字段
field.getModifiers() 字段修饰符
field.getType() 字段类型
方法
class1.getDeclaredMethods() 所有方法
class1.getMethod(方法名, 方法参数类型列表) 指向指定签名的公共方法
method.getModifiers() 方法修饰符
method.getReturnType() 方法返回值类型
method.getName()
method.getParameterTypes() 方法参数列表数组
构造方法
class1.getConstructor( 参数列表) 指向指定参数列表的公共构造方法
2.4 反射创建对象
class1.newInstance() 通过Class对象创建实例, 默认调用无参构造 ,如果没有无参构造,会出异常
constructor.newInstance( 构造方法的实参列表 )
2.5 访问字段
field.get( 实例名 ) 返回指定实例的字段值
filed.set( 实例名, 字段值) 设置实例的字段值
注意:
如果是静态字段, 在实例名位置传递null
2.6 反射调用方法
method.invoke( 实例名, 方法的实参 )
如果是静态方法, 实例名传递null
2.7 Properties+IO+Reflect实例
3Socket编程
-
应用程序的结构
单机应用程序, 只能由一个用户使用.
C/S结构, Client(客户端)/Server(服务器), 如QQ, 需要下载/安装/升级客户端, 客户端与服务器通讯, 现在手机的APP
B/S结构, Browser(浏览器)/Server(服务器), 客户只需要安装一个浏览器即可, -
开发网络程序三要素
ip地址
端口号, 每个 能上网的程序都有一个对应的端口号
通讯协议 -
Socket是一种套接字协议
-
TCP/IP协议
TCP 传输控制协议
就类似于打电话
三次握手
UDP用户数据报协议
类似于对讲机
代码
1)生产者消费者
2)反射调用方法
3)Properties+IO+Reflect
以下是socket编程代码
/** 客户端*/
import java.net.InetAddress;
import java.net.Socket;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.BufferedReader;
import java.io.IOException;
public class ChatClient {
public static void main(String[] args) throws IOException {
// 建⽴TCP客户端服务
// Socket socket = new Socket(InetAddress.getLocalHost(), 9090);
byte[] addr = {-64,-88,-108,2};
InetAddress address = InetAddress.getByAddress(addr);
Socket socket = new Socket(address, 9090);
// 获取Socket输出流对象
OutputStreamWriter socketOut = new OutputStreamWriter(socket.getOutputStream());
// 获取Socket输⼊流对象
BufferedReader socketReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
// 获取键盘输⼊流对象,读取数据
BufferedReader keyboardReader = new BufferedReader(new InputStreamReader(System.in));
String line = null;
System.out.print(“我说:”);
while ((line = keyboardReader.readLine()) != null) {
socketOut.write(line + “\n”);
// 刷新
socketOut.flush();
// 读取服务器端返回的数据
line = socketReader.readLine();
System.out.println(“服务器:” + line);
System.out.print(“我说:”);
}
socket.close();
}
}
/服务端*/
package com.bjpowernode.demo06;
import java.net.InetAddress;
import java.net.Socket;
import java.net.ServerSocket;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.BufferedReader;
import java.io.IOException;
public class ChatServer {
public static void main(String[] args) throws IOException {
// 创建服务器器端, 注册端口号
ServerSocket server = new ServerSocket(9090);
// 接受客户端的连接,产⽣生⼀一个Socket
Socket socket = server.accept();
// 获取Socket的输⼊入流
BufferedReader socketReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
// 获取Socket的输出流
OutputStreamWriter socketOut = new OutputStreamWriter(socket.getOutputStream());
// 获取键盘的输⼊入流
BufferedReader keyboardReader = new BufferedReader(new InputStreamReader(System.in));
// 读取客户端数据
String line = null;
while ((line = socketReader.readLine()) != null) {
System.out.println(“客户端:” + line);
System.out.print(“我说:”);
line = keyboardReader.readLine();
socketOut.write(line + “\n”);
socketOut.flush();
}
// 关闭
server.close();
}
}