第12章 并发
多任务(multiasking):操作系统的一种能力,看起来可以在同一时刻运行多个程序。
并发执行的进程数目不受限于CPU数目,操作系统会为每个进程分配CPU时间片,给人并行感觉。
线程是控制线程的简称,单个程序看起来同时完成多个任务,每个任务在一个线程中执行。
多线程(multithreaded):程序同时运行多个线程。
多进程与多线程有哪些区别?
每个进程都拥有一整套变量,而线程则共享数据。
线程之间通信比进程之间更有效,容易。
线程更轻量,创建和撤销比进程的开销小的多。
《Java并发编程实战》更细
12.1 什么是线程
模拟银行账户之间转账
- 将执行的任务代码放在实现Runnable接口的类的run方法中。
- 构造一个Thread对象,new Thread(r)
- 启动线程,t.start()
注释:可以通过继承Thread实现,但不推荐,应当要把并行任务和运行机制解耦合,多任务创建多个线程开销太大,后续用线程池。
警告:Thread和Runnable都有run方法,启动线程是start,直接调用run只是执行了普通线程。
转账代码
package threads;public class ThreadTest {public static final int DELAY = 10;public static final int STEPS = 100;public static final double MAX_AMOUNT = 1000;public static void main(String[] args) {var bank = new Bank(4, 100000.00);Runnable task1 = ()->{try {for (int i=0;i<STEPS;i++) {double amount = MAX_AMOUNT*Math.random();bank.transfer(0, 1, amount);Thread.sleep((int)(DELAY*Math.random()));}} catch (InterruptedException e) {}};Runnable task2 = ()->{try {for (int i=0;i<STEPS;i++) {double amount = MAX_AMOUNT*Math.random();bank.transfer(2, 3, amount);Thread.sleep((int)(DELAY*Math.random()));}} catch (InterruptedException e) {}};new Thread(task1).start();new Thread(task2).start();}}class Bank {private Integer account;private Double balance;public Bank(Integer account, Double balance) {super();this.account = account;this.balance = balance;}public void transfer(Integer from,Integer to,Double amount) {System.out.println(Thread.currentThread()+" "+ Math.round(amount*100)/100.0 +" from "+from+" to "+to+" Total Balance: "+balance);}public Integer getAccount() {return account;}public void setAccount(Integer account) {this.account = account;}public Double getBalance() {return balance;}public void setBalance(Double balance) {balance = balance;}
}
结果:
java.lang.Thread 1.0
- Thread(Runnable target),构造一个新线程,调用指定目标的run()方法。
- void start(),启动这个线程,从而调用run()方法,方法立即返回,新线程并发运行。
- void run(),调用相关Runnable的run方法。
- static void sleep(long millis),休眠指定的毫秒数。
java.lang.Runnable 1.0
- void run(),必须覆盖这个方法,提供你希望执行的任务指令。