进程与线程

进程是程序(任务)的执行过程,具有动态性;持有资源(共享内存、共享文件)和线程,是资源和线程的载体。

线程是系统中最小的执行单元,同一进程中有多个线程,线程共享进程的资源。

线程的交互,交互的方式包括互斥与同步。

线程的常用方法

java对线程的支持主要体现在类Thread和接口Runnable,它们都继承java.lang包,有一个共同的方法run()

java进程hang死_进程java

线程停止错误的方法:stop()、interrupt()

线程停止的正确方法

public class ArmyRunnable implementsRunnable {//volatile保证了线程可以正确读取其他线程写入的值
volatile boolean keepRunning = true;
@Overridepublic voidrun() {while(keepRunning) {//发动五连击
for (int i = 0; i < 5 ; i++) {
System.out.println(Thread.currentThread().getName()+ "进攻对方[" + i + "]");
}//暂停
Thread.yield();
}
System.out.println(Thread.currentThread().getName()+ "结束了战斗");
}
}

争用条件

当多个线程同时共享访问同一数据(内存区域)时,每个线程都尝试操作该数据,从而导致数据被破坏(corrupted),这种现象称为争用条件。

线程的交互:互斥与同步

互斥:在同一时间,只能有一条线程去对我们的关键数据或临界区进行操作。

互斥的实现:sysnchronized(intrinsic lock),sysnchronized相当于给代码加上一把锁,使其他线程不能进入这个关键区域访问我们的关键资源。

同步:是线程之间的一种通信机制, 由于一条线程的某些条件不具备,使得其他线程处于某种等待的状态,之后由于条件具备了,一条线程会用某种方式唤醒其他的线程。

同步的实现:

wait()/notify()/notifyAll()--Object对象的成员方法
wait set 是线程的休息室
public void transfer(int from, int to, doubleamount) {//通过synchronized 关键字来实现互斥,synchronized既可以出现在方法之上,也能以块的形式出现在方法体之中//通过对lockObj加锁实现互斥//加锁操作是有开销的,多次加锁操作会降低系统的性能
synchronized(lockObj) {//while循环,保证条件不满足时任务都会被条件阻挡,而不是继续竞争CPU资源
while (energyBoxes[from] 
lockObj.wait();
}catch(InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getName());
energyBoxes[from]-=amount;
System.out.printf("从%d转移%10.2f单位能量到%d", from, amount, to);
energyBoxes[to]+=amount;
System.out.printf("能量总和:%10.2f%n",getTotalEnergies());//唤醒所有在lockObj对象上等待的线程
lockObj.notifyAll();
}
}

扩展

Java Memory Mode

Locks & Condition

线程安全性: 原子性与可见性 ...

多线程编程常用的交互模型

Java5中并发编程工具

参考书

core java

Java concurrency in practice