线程与进程的关系:
线程是进程的一部分。
没有线程的进程可以看做是单线程的,所以进程可以单独存在,但线程必须依赖于一个进程存在。而且在系统中,资源分配的基本单位是进程,一个进程内的所有线程是共享系统分配给该进程的所有资源。(可以抽象的理解为一个大家庭(进程)内的所有成员(线程)可以一起干活,但是政府分配粮食是按家庭为单位的)
为什么要引入线程:
其实计算机最开始的是没有线程的概念或者说是单线程的,大家概念里只有进程。所以首先我们要理解进程是什么样的构成。
进程 = 程序段 + 进程控制块(PCB) + 数据段
进程的PCB就是进程的身份信息档案(PCB解释网上有很多就不展开讲)。每创建一个进程就需要相应的创建一个PCB,PCB里保存的描述信息非常的详细,创建也就意味着更大的开销。线程也有属于自己的TCB,但是TCB保存的信息可比PCB要少太多,所以线程的比进程的创建开销要小得多。
用一个Demo直观的感受多线程。
《JAVA核心技术 卷一》例题12-1和12-2
先看输出可能是这样的,可以感受到两个线程交错执行:
Thread[Thread-0,5,main]Thread[Thread-1,5,main]
14.79 from 0 to 1 964.88 from 2 to 3 Total Balance:
4000.00
Total Balance: 3035.12
Thread[Thread-0,5,main] 883.84 from 0 to 1 Total
Balance: 4000.00
Thread[Thread-0,5,main] 46.35 from 0 to 1 Total
Balance: 4000.00
Thread[Thread-1,5,main] 21.22 from 2 to 3 Total
Balance: 4000.00
Thread[Thread-0,5,main] 54.76 from 0 to 1 Total
Balance: 4000.00
Thread[Thread-1,5,main] 1.25 from 2 to 3 Total
Balance: 4000.00
代码示例
首先创建一个Bank 类
public class Bank {
private final double[] accounts;
public Bank(int n, double initialBalance) {
accounts = new double[n];
// 将initialBalance中的数分给accounts数组中的每一个元素。
Arrays.fill(accounts,initialBalance);
}
// 设置账户转移,从from账户,转移到to账户。
public void transfer(int from,