Java中的线程和网络

1.多线程

1.1 线程概述

进程和线程

进程:应用程序的执行实例(一个应用对应一个进程)

线程:CPU调度和分派的基本单位,进程中执行运算的最小单位

1.2 创建线程

1.2.1 创建线程的种类

在Java中创建线程的两种方式①继承java.lang.Thread类②实现java.lang.Runnable接口。

1.2.2 继承Thread类创建线程

步骤:

(1)定义MyThread类继承Thread类
(2)重写run()方法,编写线程执行体
(3)创建线程对象,调用start()方法启动线程

单线程:

  1. public class MyThread extends Thread {
  2. //继承Thread类并重写run()方法
  3. public void run(){
  4. for (int i = 0; i < 10; i++) {
  5. //打印输出i和线程名
  6. System.out.println(i+" 线程名:"+Thread.currentThread().getName());
  7. }
  8. }
  9. public static void main(String[] args) {
  10. //创建自定义线程对象
  11. MyThread myThread = new MyThread();
  12. //调用start()方法
  13. myThread.start();
  14. }
  15. }

6ca440c5e64a4ae69c09e079ff518648.png

多线程:

  1. public class MyThread extends Thread{
  2. public void run(){
  3. for (int i = 0; i < 50; i++) {
  4. System.out.println(i+" 线程名:"+Thread.currentThread().getName());
  5. }
  6. }
  7. public static void main(String[] args) {
  8. MyThread1 myThread1 = new MyThread();
  9. MyThread1 myThread2 = new MyThread();
  10. myThread11.start();
  11. myThread12.start();
  12. }
  13. }

80b91dd0f0e04339840eecb79dc5fc66.png

1.2.3 实现Runnable接口创建线程

步骤与上面的步骤类似,直接上代码。

单线程:

  1. public class MyRunnable implements Runnable{
  2. //实现Runnable接口并实现run()方法
  3. @Override
  4. public void run() {
  5. for (int i = 0; i < 10; i++) {
  6. System.out.println(i + " 线程名:"+Thread.currentThread().getName());
  7. }
  8. }
  9. public static void main(String[] args) {
  10. //创建MyRunnable的对象
  11. MyRunnable myRunnable = new MyRunnable();
  12. //创建Thread的一个对象,并使用myRunnable对象作为构造器参数
  13. Thread thread = new Thread(myRunnable);
  14. //调用thread对象的start方法
  15. thread.start();
  16. }
  17. }

1d51a99649994671aa8862158daa4f3a.png

多线程:

  1. public class MyRunnable implements Runnable{
  2. public void run() {
  3. for (int i = 0; i < 50; i++) {
  4. System.out.println(i + " 线程名:"+Thread.currentThread().getName());
  5. }
  6. }
  7. public static void main(String[] args) {
  8. MyRunnable1 myRunnable1 = new MyRunnable();
  9. MyRunnable1 myRunnable2 = new MyRunnable();
  10. Thread thread1 = new Thread(myRunnable1);
  11. Thread thread2 = new Thread(myRunnable2);
  12. thread1.start();
  13. thread2.start();
  14. }
  15. }

859e5140e7d74b289b097b603af0d685.png

1.3 线程的状态

1.3.1 线程流程

2b063384e3984a85b42a3d0457d52f2f.png

正常情况流程:创建状态—>就绪状态—>运行状态—>死亡状态

异常情况下流程:创建状态—>就绪状态—>运行状态—>阻塞状态—>就绪状态—>运行状态—>死亡状态

1.3.2 线程优先级

线程优先级由1-10表示,1最低,默认优先级为5,优先级高的线程获得CPU资源的概率较大

de73ac6043da48f1b41d669393870376.png

1.3.3 线程休眠

bbd4310a86e44adfb0fefab628a9afc8.png

c09b890185124f1b981608a14e05799a.png

1.4 线程安全

1.4.1 模拟网络抢票

  1. public class Site implements Runnable{
  2. private int count = 100;
  3. private int num = 0;
  4. @Override
  5. public void run() {
  6. //循环直到票被抢完
  7. while(true){
  8. if(count<=0){
  9. break;
  10. }
  11. num++;
  12. count--;
  13. //模拟网络延时
  14. try {
  15. Thread.sleep(1000);
  16. } catch (InterruptedException e) {
  17. e.printStackTrace();
  18. }
  19. //输出哪个线程抢到了票
  20. System.out.println(Thread.currentThread().getName()
  21. +"抢到了第"+num+"张票,还剩余"+count+"张票\n");
  22. }
  23. }
  24. }
  25. public class Test {
  26. public static void main(String[] args) {
  27. Site site = new Site();
  28. Thread thread1 = new Thread(site);
  29. Thread thread2 = new Thread(site);
  30. Thread thread3 = new Thread(site);
  31. //设置一下线程名称
  32. thread1.setName("小张");
  33. thread2.setName("小李");
  34. thread3.setName("小王");
  35. System.out.println("**********************");
  36. thread1.start();
  37. thread2.start();
  38. thread3.start();
  39. }
  40. }

922d1f1f140247c2892cc5816304bbd3.png

1.4.2 线程锁synchronized

synchronized可以保证线程安全,但这种方式只能保证单个服务器的线程安全,多服务器集群无法保证在,需要用到另外的方法。

e85140d04cc04f1596bfd33810f187fb.png

2.网络

2.1 网络概述

2.1.1 网络定义

网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统。提取一下关键字①多台相互连接的计算机②通信协议③资源共享

2.1.2 网络类型分类

b0eb5d6fed6a40ffaa4529cb939ab6f3.png

2.1.3 网络体系结构

ca265fef7e7f4acaac5aa9bfff3dd371.png

2.2 网络通信协议

2.2.1 网络通信协议概述

网络通信协议是在网络中不同的计算机之间进行通信而建立的规则、标准或约定的集合。在网络中,多台计算机之间通信和数据传输,必须遵循某种规约(即网络通信协议),如果不遵循则无法实现通信。

2.2.2 网络通信协议种类

(1)TCP协议(Transmission Control Protocol 传输控制协议)
面向连接的、可靠的、基于字节流的传输通信协议(数据稳定,安全)

(2)UDP协议(User Datagram Protocol 用户数据报协议)
无连接的协议,在传输数据之前,客户端和服务器并不建立和维护连接(数据不可靠,不安全)

2.3 Socket

2.3.1 Socket简介

通信链路的端点就被称为“套接字”(英文名Socket),Java中Socket是提供给应用程序的接口。Socket在Java中的路径在java.net包中。

2.3.2 网络编程三要素

(1) IP
设备在网络中的地址,是唯一的标识

(2) 端口号
应用程序在网络设备中的唯一的标识

(3) 协议
数据信息在网络中传递的规则,例如UDP,TCP等等

2.4 Socket编程实例

2.4.1 基于UDP协议的Socket编程

发送端:

  1. public class SendMsg {
  2. public static void main(String[] args) throws IOException {
  3. //创建发送端DatagramSocket实例
  4. DatagramSocket datagramSocket = new DatagramSocket();
  5. //定义传输的内容
  6. String str = "your hat is down!";
  7. //传输需要转换为字节数组
  8. byte[] b = str.getBytes();
  9. //127.0.0.1表示本机地址
  10. InetAddress inetAddress = InetAddress.getByName("127.0.0.1");
  11. //设置端口号为10086
  12. int port = 10086;
  13. //将文件内容,长度,ip地址,和端口号打包
  14. DatagramPacket dp = new DatagramPacket(b, b.length, inetAddress, port);
  15. //发送数据
  16. datagramSocket.send(dp);
  17. //释放流资源
  18. datagramSocket.close();
  19. }
  20. }

接收端:

  1. import java.io.IOException;
  2. import java.net.DatagramPacket;
  3. import java.net.DatagramSocket;
  4. public class ReceiveMsg {
  5. public static void main(String[] args) throws IOException {
  6. //创建接收端DatagramSocket实例
  7. DatagramSocket datagramSocket = new DatagramSocket(10086);
  8. //定义字节数组,创建DatagramPacket实例,用于接收数据包
  9. byte[] b = new byte[1024];
  10. DatagramPacket dp = new DatagramPacket(b,b.length);
  11. datagramSocket.receive(dp);
  12. //导出接收好的数据包
  13. byte[] data = dp.getData();
  14. int length = dp.getLength();
  15. System.out.println("接收到数据:"+new String(data,0,length));
  16. //关闭资源
  17. datagramSocket.close();
  18. }
  19. }

需要先打开端口(运行ReceiveMsg),才能接受到数据的传入

05b995b31ee94f5fa18fa8ff8f0277b4.png

2.4.2 基于TCP协议的Socket编程

客户端:

  1. public class Client {
  2. public static void main(String[] args) throws IOException {
  3. //创建客户端Socket实例,定义目标地址和端口
  4. Socket socket = new Socket("127.0.0.1",10086);
  5. //创建输出流
  6. OutputStream os = socket.getOutputStream();
  7. //输出数据
  8. os.write("哈哈".getBytes());
  9. //关闭流
  10. os.close();
  11. socket.close();
  12. }
  13. }

服务端:

  1. public class Server {
  2. public static void main(String[] args) throws IOException {
  3. //创建服务端ServerSocket实例
  4. ServerSocket ss = new ServerSocket(10086);
  5. //获取服务端端口
  6. Socket socket = ss.accept();
  7. //获取数据流并输出到控制台
  8. InputStream is = socket.getInputStream();
  9. //套一个字符集可以读取中文字符
  10. InputStream isr = new InputStreamReader(is);
  11. int b;
  12. while((b = isr.read())!= -1){
  13. System.out.print((char)b);
  14. }
  15. //关闭资源
  16. isr.close();
  17. is.close();
  18. socket.close();
  19. ss.close();
  20. }
  21. }

4248d5af37564883a854a40b9367885c.png

2.4.3 基于TPC协议和UDP的区别

552d7ece162f4f41bdbe5880d360b9c7.png

发表评论

表情:
评论列表 (有 0 条评论,5人围观)

还没有评论,来说两句吧...

相关阅读