一周总结

线程

run()
// 这里不是启动线程,而且将run方法做出一个普通方法执行
start()
// 启动线程的唯一方法

void setPriority(int Priority);
  设置线程的优先级,非一定执行要求,只是增加执行的概率
  优先级数值范围 [1 - 10] 10最高 1最低 5默认
然而优先级对线程的影响并不大!!!

共享资源能使用问题

用静态成员变量作为共享资源

synchronized (/* 锁对象 */) {
}
选择同步方法是否使用static修饰问题
1. 如果非static修饰,要保证执行的线程对象有且只有一个,因为锁对象就是当前线程对象
2. 如果是static修饰,锁对象具有唯一性,多个线程使用的锁是同一个锁。

Lock锁

  1. 对象化操作。
    创建Lock构造方法
    Lock lock = new ReentrantLock();
  2. 方法化操作。
    开锁:
    unlock();
    加锁:
    lock();

三种加锁方式的总结:

  1. 一锁一线程,一锁多线程问题。
    使用对应的锁操作对应的线程,考虑静态和非静态问题。
    同步方法和Lock锁使用。
    静态是一锁多目标,非静态是一锁一目标

  2. 涉及到同步问题时,要考虑好锁对象的选择问题
    同步代码块,同步方法,Lock对象。

守护线程

守护线程,也称之为后台线程,如果当前主线程GG思密达,守护线程也就GG思密达。
守护线程一般用于:
1. 自动下载
2. 操作日志
3. 操作监控

方法是通过线程对象
setDeamon(boolean flag);
true为守护线程
false缺省属性,正常线程

在这里插入图片描述

线程池
public class Demo1 {
	public static void main(String[] args) {
		// 1. 创建线程池对象
		ExecutorService service = Executors.newFixedThreadPool(5);
		
		// 2. 创建一个MyThread1 Runnable接口实现类对象、
		MyThread1 target = new MyThread1();
		
		// 3. 使用线程池对象中的一个线程,指定目标代码
		// 初始化线程数为5,这里使用的是线程池中已经存在的5个线程来执行代码
		service.submit(target);
		service.submit(target);
		service.submit(target);
		service.submit(target);
		service.submit(target);
		
		// 因为原本的5个线程都在被使用中,这里需要等待5个线程执行完毕,出现空闲线程
		// 来执行对应的目标代码
		service.submit(target);
		service.submit(target);
		
		// 4. 关闭线程池
		// 一般不用关闭线程池,会随着程序的退出而关闭
		// service.shutdown();
	}
}
Lambda表达式
	 * 1. 有参数
	 * 2. 有返回值
	 * 
	 * (Person o1, Person o2) -> {
	 * 		return o1.getAge() - o2.getAge();
	 * }
	 * 标准Lambda

使用前提

  1. 有且只有一个缺省属性为public abstract方法的接口,例如 Comparator接口,Runnable接口
  2. 使用lambda表达式是有一个前后要求约束的
    方法的参数为接口类型,或者说局部变量使用调用方法,可以使用lambda也OK
  3. 有且只有一个抽象方法的接口,称之为【函数式接口】
网络编程
C/S和B/S

C/S
客户端 服务器软件结构
服务提供商给予用户服务需要准备的内容
1. 各大平台的客户端
Android iOS PC Windows Linux macOS
QQ 微信 淘宝 JD

软件更新:
LOL服务器版本更新,同时本地软件也要进行更新操作。这个操作非常耗时。
热更新

B/S
浏览器 服务器软件结构
服务提供商只要提供数据服务就OK,以及前端数据展示方式
1. 浏览器提供商非常非常多
谷歌,火狐,欧朋,Safari,Edge
2. 服务器提供服务
软件更新:
服务器更新数据,浏览器刷新就ok了

UDP和TCP/IP区别
UDP
1. 面向无连接,数据传递不算特别安全
2. 因为面向无连接,传输速度快
3. 因为面向无连接,数据传递存在丢包问题
4. UDP没有客户端和服务器区别,都可以作为发送端和接收端
UDP协议使用场景
直播,网络游戏

TCP/IP
1. 面向连接,数据传递较为安全
2. 因为面向连接,所有传递速度较慢
3. 面向连接,数据传递有保障
4. TCP/IP协议是有明确的服务器和客户端概念
TCP/IP协议使用场景
客户端登陆,数据下载,文件传输

网络编程的三要素
1.协议
2.IP地址
3.端口号

UDP的应用

/*
流程:
	1. 创建UDP服务器对应的发送端Socket
	2. 准备对应数据包,需要带有指定数据
	3. 发送数据 send
	4. 关闭UDP发送端
 */
public class SenderDemo1 {
	public static void main(String[] args) throws IOException {
		System.out.println("发送端启动");
		// 创建对应的Socket
		DatagramSocket socket = new DatagramSocket();
		
		// 准备数据包
		byte[] bytes = "今天中午吃蒸羊羔...".getBytes();
		DatagramPacket packet = new DatagramPacket(bytes,  // 字节数组数据
				bytes.length,  // 字节数组数据长度
				InetAddress.getLocalHost(),  // 指定接收端IP地址
				8848); // 8848对应端口号
		
		// 发送数据包
		socket.send(packet);
		
		// 关闭UDP发送端
		socket.close();
	}
}

/*
流程:
	1. 打开UDP服务,并且监听指定端口
	2. 创建新的空数据包
	3. 通过Socket接收数据 receive
	4. 关闭UDP服务接收端
 */
public class ReceiveDemo1 {
	public static void main(String[] args) throws IOException {
		// 创建Socket监听端口
		DatagramSocket socket = new DatagramSocket(8848);
		
		// 准备空数据包
		byte[] buf = new byte[1024];
		DatagramPacket packet = new DatagramPacket(buf, buf.length);
		
		// 接收数据
		socket.receive(packet);
		
		// 确定接收到的字节长度
		int length = packet.getLength();
		
		System.out.println(new String(buf, 0, length));
		
		// 关闭socket
		socket.close();
		
	}
}

UDP数据传递丢失问题

  1. 网络不够好,稳定性不行,带宽不够
  2. 电脑性能不好
TCP

在这里插入图片描述
代码演示

/*
流程:
	1. 创建ServerSocket服务器,同时监听指定端口
	2. 通过accept方法获取Socket连接,得到客户端Socket对象
	3. 通过Socket对象,获取InputStream,读取客户端发送数据
	4. 通过Socket对象,获取OutputStream,发送数据给客户端
	5. 关闭服务 
 */
public class TcpServer1 {
	public static void main(String[] args) throws IOException {
		System.out.println("服务器启动");
		System.out.println("-----------------------");
		// 1. 创建ServerSocket服务器,同时监听指定端口
		ServerSocket serverSocket = new ServerSocket(8848);
	
		// 2. 通过accept方法获取Socket连接,得到客户端Socket对象
		Socket socket = serverSocket.accept();
		
		// 3. 通过Socket对象,获取InputStream,读取客户端发送数据
		InputStream inputStream = socket.getInputStream();
		
		// IO流操作
		byte[] buf = new byte[1024];
		int length = inputStream.read(buf);
		System.out.println(new String(buf, 0, length));
        
		// 4. 通过Socket对象,获取OutputStream,发送数据给客户端
		OutputStream outputStream = socket.getOutputStream();
		String str = "欢迎来到德莱联盟";
		
		outputStream.write(str.getBytes());
		
		// 5. 关闭Socket服务 同时关闭当前Socket使用的输入字节流和输出字节流	
		// Closing this socket will also close the socket's InputStream and OutputStream. 
		socket.close();	
	}
}
/*
流程:
	1. 创建Socket服务,同时明确连接服务器的IP地址和对应端口号
	2. 通过Socket对象,获取对应的OutputStream对象,发送数据给服务器
	3. 通过Socket对象,获取对应的InputStream对象,接收服务器发送数据
	4. 关闭服务
 */
public class TcpClient1 {
	public static void main(String[] args) throws UnknownHostException, IOException {
		System.out.println("客户端启动");
		System.out.println("------------------------");
		// 1. 创建Socket服务,同时明确连接服务器的IP地址和对应端口号
		Socket socket = new Socket("192.168.31.154", 8848);
		
		// 2. 通过Socket对象,获取对应的OutputStream对象,发送数据给服务器
		OutputStream outputStream = socket.getOutputStream();
		
		outputStream.write("你好服务器!!!".getBytes());
		
		// 3. 通过Socket对象,获取对应的InputStream对象,接收服务器发送数据
		InputStream inputStream = socket.getInputStream();
		
		byte[] buf = new byte[1024];
		int length = inputStream.read(buf);
		System.out.println(new String(buf, 0, length));
		
		// 4. 关闭服务
		socket.close();
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值