进程:1、程序(任务)的执行过程2、持有资源(共享内存、共享文件)和线程
线程:1、系统中的最小执行单元,2、一个进程中有多个线程,3,线程共享进程中的资源
线程交互:互斥或同步
如何正确的停止线程:设置退出标志,如:boolean isRunning;
interrupte()
this.isInterrrupted()方法作为判断 ,实质也是一种标志,但是调用sleep或join方法会抛出异常
错误的停止线程:stop()原因:线程会戛然而止,让线程不受控制,不知道做了那些工作,哪些工作没做。
while(!this.isInterrupted()) { System.out.println("运行中"); long starttime = System.currentTimeMillis(); while (System.currentTimeMillis() - starttime < 1000) { } }
wait()和notifyAll()
public void transfer(int from, int to, double amount) { // if (enrgyBoxes[from] < amount) { // return; // } synchronized(lockObject){ //进入wait set while(enrgyBoxes[from] < amount){ try { lockObject.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println(Thread.currentThread().getName()); enrgyBoxes[from] -= amount; System.out.printf("从%d转移%10.2f单位能量到%d", from, amount, to); enrgyBoxes[to] += amount; System.out.println("能量总和" + getTotalEnergy()); //当业务逻辑处理完成后,释放锁,并唤醒在此对象上等待的所有线程 lockObject.notifyAll(); }
互斥:synchronized加锁实现线程互斥,多个线程竞争同一个资源,这是多个线程就是互斥的
同步:wait(),notify(),notifyAll()实现同步,都是Object对象的方法
多线程扩展:locks和condition
线程安全
死锁
模拟窗口买票:
继承Trhead类(错误的方法)public class TicketThread extends Thread { private int ticketCount = 5; private String name; private Object lockObject = new Object(); public TicketThread(String name){ this.name = name; } @Override public void run() { synchronized (lockObject) { while (ticketCount > 0) { ticketCount--; System.out.println(name + "卖了一张票,剩余" + ticketCount + "张"); } } } }
TicketThread t1 = new TicketThread("窗口一"); TicketThread t2 = new TicketThread("窗口二"); TicketThread t3 = new TicketThread("窗口三"); t1.start(); t2.start(); t3.start();
实现Runnable接口(正确的写法)
public class TicketRunnable implements Runnable { private int ticketCount = 5; @Override public void run() { while (ticketCount > 0) { ticketCount--; System.out.println(Thread.currentThread().getName() + "卖了一张票,剩余" + ticketCount + "张"); } } }
TicketRunnable ticketRunnable = new TicketRunnable(); Thread t1 = new Thread(ticketRunnable,"窗口一"); Thread t2 = new Thread(ticketRunnable,"窗口二"); Thread t3 = new Thread(ticketRunnable,"窗口三"); t1.start(); t2.start(); t3.start();
线程的生命周期:
错误的停止线程:stop()原因:线程会戛然而止,让线程不受控制,不知道做了那些工作,哪些工作没做。