共计 2137 个字符,预计需要花费 6 分钟才能阅读完成。
多线程和网络编程
一. 多线程
1. 过程和线程
过程:是正在运行的程序
是零碎进行资源分配和调用的独立单位
每一个过程都有它本人的内存空间和系统资源
线程:是过程中的单个顺序控制流,是一条执行门路。
单线程:一个过程如果只有一条执行门路,则称为单线程程序。
多线程:一个过程如果有多条执行门路,则称为多线程程序。
2. 多线程的实现形式
形式 1: 继承 Thread 类:
定义一个类 MyThread 继承 Thread 类
在 MyThread 类中重写 run()办法
创立 MyThread 类的对象
启动线程
两个小问题:
●为什么 要重写 run()办法?
因为 run()是用来封装被线程执行的代码
●run() 办法和 start()办法的区别?
run(): 封装线程执行的代码, 间接调用, 相当于一般办法的调用
start(): 启动线程; 而后由 JVM 调用此线程的 run() 办法。
形式 2: 实现 Runnable 接口
●定义一个类 MyRunnable 实现 Runnable 接口
●在 MyRunnable 类中重写 run() 办法
●创立 MyRunnable 类的对象
●创立 Thread 类的对象,把 MyRunnable 对象作为构造方法的参数
●启动线程
多线程的实现计划有两种:
●继承 Thread 类
●实现 Runnable 接口
相比继承 Thread 类,实现 Runnable 接口的益处:
●防止了 Java 单继承的局限性
●适宜多个雷同程序的代码去解决同一个资源的状况,把线程和程序的代码、数据无效拆散, 较好的体现了面向对象的设计思维
3. 设置和获取线程名称
Thread 类中设置和获取线程名称的办法
●void setName(String name): 将此线程的名称更改为等于参数 name
●String getName(): 返回此线程的名称
●通过构造方法也能够设置线程名称
如何获取 main()办法所在的线程名称?
●public static Thread currentThread0: 返回对以后正在执行的线程对象的援用
4. 线程调度
线程有两种调度模型
●分时调度模型: 所有线程轮流应用 CPU 的使用权,平均分配每个线程占用 CPU 的工夫片
●抢占式调度模型: 优先让优先级高的线程应用 CPU, 如果线程的优先级雷同,那么会随机抉择一个, 优先级高的线程获取的 CPU 工夫片绝对多一些
Java 应用的是抢占式调度模型
如果计算机只有一个 CPU, 那么 CPU 在某一个时刻只能执行一条指令, 线程只有失去 CPU 工夫片, 也就是使用权,
能够执行指令。所以说多线程程序的执行是有随机性,因为谁抢到 CPU 的使用权是不肯定的
Thread 类中设置和获取线程优先级的办法
●public final int getPriority(): 返回此线程的优先级
●public final void setPriority(int newPriority): 更改此线程的优先级
线程默认优先级是 5; 线程优先级的范畴是: 1-10
线程优先级高仅仅示意线程获取的 CPU 工夫片的几率高,然而要在次数比拟多, 或者屡次运行的时候能力看到你想要的成果
5. 线程管制
办法名 | 阐明 |
---|---|
static void sleep(long millis) | 使以后正在执行的线程停留 (暂停执行)指定的毫秒数 |
void join() | 期待这个线程死亡 |
void setDaemon(booleanon) | 将此线程标记为守护线程,当运行的线程都是守护线程时,Java 虚拟机将退出 |
6. 同步代码块
锁多条语句操作共享数据,能够应用同步代码块实现
●格局:
synchronized(任意对象) {
多条语句操作共享数据的代码
}
●synchronized(任意对象): 就相当于给代码加锁了, 任意对象就能够看成是一把锁
同步的益处和弊病
●益处: 解决了多线程的数据安全问题
●弊病: 当线程很多时,因为每个线程都会去判断同步上的锁,这是很消耗资源的,无形中会升高程序的运行效率。
7. 同步办法
同步办法: 就是把 synchronized 关键字加到办法上
●格局:
修饰符 synchronized 返回值类型 办法名 (办法参数){}
同步办法的锁对象是什么呢?
●this
同步静态方法: 就是把 synchronized 关键字加到静态方法上
●格局:
修饰符 static synchronized 返回值类型 办法名 (办法参数) {}
同步静态方法的锁对象是什么呢?
●类名.class
8. 线程平安的类
StringBuffer
●线程平安,可变的字符序列
●从版本 JDK 5 开始, 被 StringBuilder 代替。通常应该应用 StringBuilder 类, 因为它反对所有雷同的操作,但它
更快,因为它不执行同步
Vector:
●从 Java 2 平台 v1.2 开始,该类改良了 List 接口, 使其成为 Java Collections Framework 的成员。与新的汇合实现
不同,Vector 被同步。如果不须要线程平安的实现,倡议应用 ArrayList 代替 Vector
Hashtable:
●该类实现了一个哈希表, 它将键映射到值。任何非 null 对象都能够用作键或者值
●从 Java 2 平台 v1.2 开始,该类进行了改良,实现了 Map 接口, 使其成为 Java Collections Framework 的成员。
与新的汇合实现不同,Hashtable 被同步。如果不须要线程平安的实现,倡议应用 HashMap 代替 Hashtabl。