知识点:多线程与网络编程
了解进程
:进程是应用程序执行的实例,有独立的内存空间和系统资源
了解线程
:线程是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网络通信
- 用来实现双向安全连接网络通信
- 基于TCP协议的Socket网络通信
- 面向连接、可靠的数据传输服务:基于TCP协议
- 流式套接字(SOCK_STREAM)
-
- Socket通信模型
- 进行网络通信时,Socket需要借助数据流来完成数据的传递工作
- Socket通信模型
- **基于TCP协议使用java.net包下的Socket&ServerSocket
- 在编写程序时因有连接,故先写服务器后写客户端
-
- 数据报式套接字(SOCK_DGRAM)
- 无连接服务:基于UDP协议
- 数据报式套接字(SOCK_DGRAM)
**基于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