线程:
可独立运行的代码片段。
属于进程。
多线程:
一个进程中有多个可独立运行的代码片段。
主线程:main
子线程:
继承Thread类
实现Runnable接口
---run
开启线程:
start
线程安全问题:
多线程操作同一个共享资源,还有多行代码编写,其中一个线程对其没有执行完,另一个线程参与执行,有可能导致错误数据产生。
同步代码块
线程生命周期:
新建 可运行 正在运行 消亡
阻塞:
sleep(time)
wait(), notify()/notifyAll()
消费者和生产者:
生产线程和消费线程,操作同一个资源,但是操作的任务不同
wait:使线程处于等待状态,并且会释放锁
notify:唤醒处于等待状态的线程
notifyAll:唤醒所有处于等待状态的线程
以上三个方法是定义在Object类中,必须用在同步中
jdk5.0后对以上关于锁和线程等待和唤醒方法有优化,使用Lock接口手动获取和释放锁,使用Condition替代了等待和唤醒的方法。
final Lock lock = new ReentrantLock(); //获取锁对象
final Condition 生产 = lock.newCondition(); //锁对象与生产线程进行绑定
final Condition 消费 = lock.newCondition(); //锁对象与消费线程进行绑定
public void save(){
lock.lock(); //获取锁
try{
if(str != null)
生产.await(); //等待
......
消费.signal(); //唤醒
消费.signalAll();
}finally{
lock.unlock(); //释放锁
}
}
sleep(time):Thread类中的静态方法,使当前线程休眠一段时间,时间是毫秒值
wait():Object类中的实例方法,使当前线程处于等待状态,需要被唤醒
网络编程:
java.net
网络通信要素:
IP地址,端口号(1-65535 1-1024),协议(TCP、UDP)
UDP:
面向无连接,不可靠协议,速度快
数据以数据报包进行发送,不能超过64k
TCP:
面向有连接,可考协议,速度慢
可以发送大量数据
"三次握手"
IP对象