多线程和网络编程
一.多线程
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。