进程和线程的关系

 

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()方法。线程不能调用对象上等待或通知的方法,除非它拥有那个对象的锁。