4、多线程和网络编程

知识点:多线程与网络编程

了解进程 :进程是应用程序执行的实例,有独立的内存空间和系统资源
了解线程 :线程是CPU调度和分派的基本单位,进程中执行运算的最小单位,真正在CPU上运行的是线程
  • main()方法即为主线程入口
  • 在一个时间只有一个线程在执行,采用抢占资源的方式
  • 线程分为两种
    • 系统级(核心级)线程
    • 用户级的线程
  • 使用线程步骤:
  • 定义线程
  • 创建线程对象
  • 启动线程
    • *如果直接调用thread()的无参构造创建线程对象,start()方法什么都不会做
  • 终止线程

在Java中创建线程的两种方式
继承Java.lang.Thread类
不共享资源
实现Java.lang.Runnable接口
共享资源
使用Runnable对象创建线程时,多个线程共享Runnable的资源
*一个进程里可以有多个线程,但至少包含一个线程(主线程):Main(String[] args)方法是主线程
**当一个类只创建线程时刻继承Thread类
**如果一个类既需要使创建线程又需要继承某个类可以实现Runnable接口
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
/*
  * 方式一: 继承Thread类来创建线程
* 创建线程:输出1-100之间的偶数
  */
//1. 继承Thread类
public   class  TestThread  extends  Thread{
      
     private   int  count =  0 ;
      
     //2.重写Thread类的run()方法
     public   void  run(){
         while (count< 100 ){
             count++;
             if (count% 2 == 0 ){
                 System.out.println( "count=" +count);
             }
         }
     }
}
//——————————————————————————————————————————————
/*
 * 启动TestThread线程
 */
public   class  TestThread2 {
     public   static   void  main(String[] args) {
         //3.创建线程对象
         TestThread mt =  new  TestThread();
         //4.启动线程(重点):调用start()方法
         mt.start();
     }
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
/*
* 方式二:实现Runnable接口来创建线程
  * 创建线程::输出1-100之间的偶数
  */
//1.实现Runnable接口
public   class  TestThread   implements  Runnable{
 
     private   int  count =  0 ;
      
     //2.实现Runnable接口的run()方法
     public   void  run(){
         while (count< 100 ){
             count++;
             if (count% 2 == 0 ){
                 System.out.println( "count=" +count);
             }
         }
     }
}
//——————————————————————————————————————————————
/*
 * 启动TestThread线程
 */
public   class  TestThread2 {
     public   static   void  main(String[] args) {
         //3.创建线程对象
         TestThread tt =  new  TestThread();
         Thread thread =  new  Thread(tt);
         //4.启动线程(重点):调用start()方法
         thread.start();
     }
}

————————————————————————————————
1.1 线程的状态
线程的生命周期包括四个状态:新生状态(new)、可运行状态(run)、阻塞状态(wait)和死亡状态(dead)
新生状态 :new线程对象之后 ———— 执行start()方法之前
可运行状态 :执行statr()方法之后 ———— 抢占到资源之前
阻塞状态 :运行状态的线程遇到如:睡眠状态(sleep()方法)时,等待I/O流执行结果时,其他线程占用锁时,通过方法等待时,suspend()和resume()方法(该方法是一个危险的方法,JDK以将其改为过期的方法)
死亡状态 :run()方法退出时或遇到异常时停止,死亡状态的状态并不会立即释放空间

————————————————————————————————
1.2 线程调度
多个线程处于可运行状态
优先级:反映线程的重要或紧急程度
线程的优先级用1~10表示,10的优先级最高,默认值是5
更改优先级的方法
setPriority(int grade)
1
2
//更改线程的优先级:取值范围1~10
myThread.setPriority( 3 );
线程调度的方法
joid() :将制定的线程加入到当前线程
sleep() :将当前线程阻塞制定的毫秒数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
//继承Thread类
public   class  Mythread  extends  Thread{
     //重写Thread类run方法:打印1~5
     public   void  run(){
         for ( int  i =  1 ; i <=  5 ; i++){
             System.out.println( this .getName()+ ":" +i);
         }
     }
}
//——————————————————————————————————————————————
//测试类:测试线程,测试join()方法
public   class  Test {
     public   static   void  main(String[] args) {
         //for循环打印1~10
         for ( int  i =  1 ; i <=  10 ; i++){
             //如果i==5则创建Mythread对象执行启动线程
             if (i== 5 ){
                 //创建线程对象
                 Mythread mt =  new  Mythread();
                 //启动线程
                 mt.start();
                 //捕获异常
                 try  {
                      //让main阻塞:优先执行mt线程
                     mt.join();
                 catch  (InterruptedException e) {
                     e.printStackTrace();
                 }
             }
             //Thread.currentThread()方法:返回当前运行的线程对象
             System.out.println(Thread.currentThread().getName()+ ":" +i);
         }
     }
}
执行结果:














1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//测试类:测试sleep()方法
public   class  Test {
     public   static   void  main(String[] args) {
         //打印一句话
         System.out.println( "wait" );
         //捕获异常
         try  {
             //休眠5000毫秒(5秒)
             Thread.sleep( 5000 );
         catch  (InterruptedException e) {
             e.printStackTrace();
         }
         //打印第二句话
         System.out.println( "contionue" );
     }
}

————————————————————————————————
1.3 Socket
通信链路的断点就被称为“套接字”(英文名Socket)
是提供给引用程序的接口
通过Socket发出请求或相应请求
  • 端口:计算机上一些整形数字来表现,每一种服务打开一个Socket,对应一个端口
    • 1-1023被系统占用
    • MySQL:默认端口3306
    • Oracle:默认端口1523
Socket的底层机制复杂,Java平台提供了一些简单的API,可以更简单有效的使用Socket开发而无需了解底层机制
  • Socket分类:
    • 流式套接字(SOCK_STREAM)
      • 面向连接、可靠的数据传输服务:基于TCP协议
        • 基于TCP协议的Socket网络通信
          • 用来实现双向安全连接网络通信
    • Socket通信模型
      • 进行网络通信时,Socket需要借助数据流来完成数据的传递工作
  • **基于TCP协议使用java.net包下的Socket&ServerSocket
  • 在编写程序时因有连接,故先写服务器后写客户端

    • 数据报式套接字(SOCK_DGRAM)
      • 无连接服务:基于UDP协议
**基于UDP协议使用java.net包下的:
在编写程序时因无连接,故先写服务器与客户端都可以
DatagramPacket 对象封装数据包
DatagramSocket 发送数据包
DatagramSocket 接收数据包
DatagramPacket 处理数据包
    • 原始式套接字(SOCK_RAW)

  • TCP协议与UDP协议
 
TCP
UDP
是否连接
面向连接
面向非连接
传输可靠性
可靠
不可靠
速度
  • java.net包
    • Socket
    • ServerSocket
    • DatagramPacket
    • DatagramSocket
    • InetAddress

————————————————————————————————
1.3 多线程实现多请求
1.采用多线程的方法
2.一个专门负责监听的应用主服务程序
3.一个专门负责处理请求的线程程序

服务器:
一直监听客户请求,一旦监听到有客户请求,理科创建一个线程,开启线程
线程:
接收客户请求,给予客户一个相应(之前服务器做的事)
线程构造方法中去绑定客户端的Socket
客户端:
发送请求到服务器
接收服务器的相应
InetAddress:获得客户端的IP

猜你喜欢

转载自blog.csdn.net/weixin_42567749/article/details/81032100
今日推荐