进程和线程

来源:互联网 发布:mac os xcode 编辑:程序博客网 时间:2024/05/22 17:25

进程: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()原因:线程会戛然而止,让线程不受控制,不知道做了那些工作,哪些工作没做。