Java多线程及实现PV操作

Java中实现多线程有两种方式,继承Thread或者实现Runnable接口。
讲下第二种方法,Runnable接口需要实现run()。产生一个线程时需要Thread类实例化,然后调用start()。
代码简略如下

public class Buss {
    public static void main(String[] args) {
        Driver d = new Driver();
        Thread t1 = new Thread(d);
        t1.start();
    }
}

class Driver implements Runnable {
    @Override
    public void run() {
        while (true) {
            System.out.println("The bus runs");
        }
    }
}

线程是可以共享内存的,当多个线程时,就需要协调两个线程。比如两个线程需要共用一个变量,两个线程存在某种先后关系。
大部分问题就可以用pv操作来解决。
p操作(函数):占用;v操作(函数):释放;他们控制共同的一个变量:信号量。信号量初始设置为资源数量。p操作时:信号量–;若信号量大于等于0,则说明还有资源,若小于0,则等待。v操作时:信号v量++;若信号量大于0,则说明还有资源 叫醒一个等待的。
pv操作就可以控制住资源了。
上面的pv操作都必须用原语实现:即操作不能被另一个进程打断。

在Java中,synchronized关键字用来描述这个函数是原语操作。Object类中wait()和notify()可以实现等待唤醒。(实际上这是管程)
可以用这些来实现pv操作类

class Syn {
    int s = 0;

    Syn() {
    }

    Syn(int s) {
        this.s = s;
    }

    public synchronized void P() {
        s--;
        if (s < 0) {
            try {
                this.wait();
            } catch (Exception e) {
                System.out.println("error");
            }
        }
    }

    public synchronized void V() {
        s++;
        if (s <= 0) {
            this.notify();
        }
    }
}

用以上内容就可以完成大部分多线程同步问题
如:
司机售票员问题:司机需要开车停车,售票员需要开关门,他们需要看车的情况。

生产者消费者问题:仓库是有限的,生产者生产产品,消费者消费。

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值