进程和线程的关系
1. 一个 线程只能属于一个进程,一个进程可以有多个线程,但至少有一个线程。
2. 资源分配给进程,同一进程的所有线程共享进程中的所有资源。
3. 处理机分配给线程, 真正在处理机上运行的是线程。
4. 线程在执行中需要同步协作,不同的进程的线程间要利用消息通信的办法实现同步。
java 线程
线程离开运行状态的方法
1. 调用 Thread.sleep() 方法,使当前线程睡眠 至少。。毫秒。(尽管它可能在达到睡眠时间前被中断)
2. Thread.yield(),不能保证,它可能使当前线程回到可运行状态,使其它同优先级的线程有机会执行。
3. 调用join() 方法,保证当前线程停止执行,直到该线程加入的线程执行完成为止,然后,如果加入的线程没有存活,则当前线程不需要停止。
线程同步与锁
一、同步问题的提出
线程的同步是为了防止多个线程访问一个数据对象时,对数据造成的破坏。
二、何时需要同步
在多个线程同时访问互斥(可交换)数据是,应该同步以保护数据,确保两个线程不会同时修改更改它。
对于非静态字段中可更改的数据,通常使用非静态方法访问。
对于静态字段中可更改的数据,通常使用静态方法访问。
三、java 线程交互
void notify() 唤醒在此对象监视器上等待的单个线程。
void notifyAll() 唤醒在此对象监视器上等待的所有线程。
void vait() 导致当前的线程等待,直到其他的线程调用此对象的notify()方法或notifyAll() 方法。
当然wait() 还有另外两个重载方法:
void wait(long timeout) 导致当前的线程等待,直到其他线程调用此对象的notity方法或notifyAll()方法,或者超过指定的时间量。
void wait(long timeout, int nanos) 导致当前的线程等待,直到其他线程调用此对象的notify() 方法或notifyAll()方法, 或者其他某个线程中断当前线程,或者已超过摸个实际时间量。
关于等待/通知,要记住的关键点是:
必须从同步环境内调用wait()\ notify()\notifyAll()方法。线程不能调用对象上等待或通知的方法,除非它拥有那个对象的锁。