关于java通知模式的信息

博主:adminadmin 2022-11-26 09:34:06 64

今天给各位分享java通知模式的知识,其中也会对进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

java怎么调用火狐浏览器来实现系统消息通知

尊敬的用户,您好!很高兴为您答疑。

您说的那种每隔一段时间自动查询可以称之为主动请求,这样的功能与一般的js执行不存在任何区别,您利用js提示框即可实现该需求。(可以利用jquery的弹窗组件)。但是因为浏览器安全机制的问题,您的js是无法驱动到浏览器API的消息提示的,而java作为动态语言,在此模式下运行于服务器端,对于驱动客户端就更加是无能为力了。要想实现您的需求,您还可以考虑采用长轮询的方式,此模式相对于您这样的自动循环理论上对于服务器的负载压力稍小。

希望我的回答对您有所帮助,如有疑问,欢迎继续咨询我们。

JAVA23种设计模式

设计模式主要分三个类型:创建型、结构型和行为型。

其中创建型有:

一、Singleton,单例模式:保证一个类只有一个实例,并提供一个访问它的全局访问点

二、Abstract Factory,抽象工厂:提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们的具体类。

三、Factory Method,工厂方法:定义一个用于创建对象的接口,让子类决定实例化哪一个类,Factory Method使一个类的实例化延迟到了子类。

四、Builder,建造模式:将一个复杂对象的构建与他的表示相分离,使得同样的构建过程可以创建不同的表示。

五、Prototype,原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型来创建新的对象。

行为型有:

六、Iterator,迭代器模式:提供一个方法顺序访问一个聚合对象的各个元素,而又不需要暴露该对象的内部表示。

七、Observer,观察者模式:定义对象间一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知自动更新。

八、Template Method,模板方法:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,TemplateMethod使得子类可以不改变一个算法的结构即可以重定义该算法得某些特定步骤。

九、Command,命令模式:将一个请求封装为一个对象,从而使你可以用不同的请求对客户进行参数化,对请求排队和记录请求日志,以及支持可撤销的操作。

十、State,状态模式:允许对象在其内部状态改变时改变他的行为。对象看起来似乎改变了他的类。

十一、Strategy,策略模式:定义一系列的算法,把他们一个个封装起来,并使他们可以互相替换,本模式使得算法可以独立于使用它们的客户。

十二、China of Responsibility,职责链模式:使多个对象都有机会处理请求,从而避免请求的送发者和接收者之间的耦合关系

十三、Mediator,中介者模式:用一个中介对象封装一些列的对象交互。

十四、Visitor,访问者模式:表示一个作用于某对象结构中的各元素的操作,它使你可以在不改变各元素类的前提下定义作用于这个元素的新操作。

十五、Interpreter,解释器模式:给定一个语言,定义他的文法的一个表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。

十六、Memento,备忘录模式:在不破坏对象的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。

结构型有:

十七、Composite,组合模式:将对象组合成树形结构以表示部分整体的关系,Composite使得用户对单个对象和组合对象的使用具有一致性。

十八、Facade,外观模式:为子系统中的一组接口提供一致的界面,fa?ade提供了一高层接口,这个接口使得子系统更容易使用。

十九、Proxy,代理模式:为其他对象提供一种代理以控制对这个对象的访问

二十、Adapter,适配器模式:将一类的接口转换成客户希望的另外一个接口,Adapter模式使得原本由于接口不兼容而不能一起工作那些类可以一起工作。

二十一、Decrator,装饰模式:动态地给一个对象增加一些额外的职责,就增加的功能来说,Decorator模式相比生成子类更加灵活。

二十二、Bridge,桥模式:将抽象部分与它的实现部分相分离,使他们可以独立的变化。

二十三、Flyweight,享元模式

23种设计模式要在这里详细的都说一遍内容实在太多了啊,推荐你一本好书《软件秘笈:设计模式那点事》,里面讲解的23中设计模式例子很生动,容易理解,还有JDK中设计模式应用情况,看了收获挺大的!百度里面搜“设计模式”,第一条中设计模式百度百科中就有首推该图书,浏览量在20几万以上的,不会错的。

祝你早日学会设计模式!

如何在 Java 中正确使用 wait,notify 和 notifyAll

我们先来了解一下为什么要使用wait,notify

首先看一下以下代码:

synchronized(a){

        ...//1

synchronized(b){

}

}

synchronized(b){

... //2

synchronized(a){

}

}

假设现在有两个线程, t1 线程运行到了//1 的位置,而 t2 线程运行到了//2 的位置,接

下来会发生什么情况呢?

此时, a 对象的锁标记被 t1 线程获得,而 b 对象的锁标记被 t2 线程获得。对于 t1 线程

而言,为了进入对 b 加锁的同步代码块, t1 线程必须获得 b 对象的锁标记。由于 b 对象的锁标记被 t2 线程获得, t1 线程无法获得这个对象的锁标记,因此它会进入 b 对象的锁池,等待 b 对象锁标记的释放。而对于 t2 线程而言,由于要进入对 a 加锁的同步代码块,由于 a 对象的锁标记在 t1 线程手中,因此 t2 线程会进入 a 对象的锁池。

此时, t1 线程在等待 b 对象锁标记的释放,而 t2 线程在等待 a 对象锁标记的释放。由

于两边都无法获得所需的锁标记,因此两个线程都无法运行。这就是“死锁”问题。

在 Java 中,采用了 wait 和 notify 这两个方法,来解决死锁机制。

首先,在 Java 中,每一个对象都有两个方法: wait 和 notify 方法。这两个方法是定义

在 Object 类中的方法。对某个对象调用 wait()方法,表明让线程暂时释放该对象的锁标记。

例如,上面的代码就可以改成:

synchronized(a){

...//1

a.wait();

synchronized(b){

}

}

synchronized(b){

... //2

synchronized(a){

...

a.notify();

}

}

这样的代码改完之后,在//1 后面, t1 线程就会调用 a 对象的 wait 方法。此时, t1 线程

会暂时释放自己拥有的 a 对象的锁标记,而进入另外一个状态:等待状态。

要注意的是,如果要调用一个对象的 wait 方法,前提是线程已经获得这个对象的锁标

记。如果在没有获得对象锁标记的情况下调用 wait 方法,则会产生异常。

由于 a 对象的锁标记被释放,因此, t2 对象可以获得 a 对象的锁标记,从而进入对 a

加锁的同步代码块。在同步代码块的最后,调用 a.notify()方法。这个方法与 wait 方法相对应,是让一个线程从等待状态被唤醒。

那么 t2 线程唤醒 t1 线程之后, t1 线程处于什么状态呢?由于 t1 线程唤醒之后还要在

对 a 加锁的同步代码块中运行,而 t2 线程调用了 notify()方法之后,并没有立刻退出对 a 锁的同步代码块,因此此时 t1 线程并不能马上获得 a 对象的锁标记。因此,此时, t1 线程会在 a 对象的锁池中进行等待,以期待获得 a 对象的锁标记。也就是说,一个线程如果之前调用了 wait 方法,则必须要被另一个线程调用 notify()方法唤醒。唤醒之后,会进入锁池状态。线程状态转换图如下:

由于可能有多个线程先后调用 a 对象 wait 方法,因此在 a 对象等待状态中的线程可能

有多个。而调用 a.notify()方法,会从 a 对象等待状态中的多个线程里挑选一个线程进行唤醒。

与之对应的,有一个 notifyAll()方法, 调用 a.notifyAll() 会把 a 对象等待状态中的所有线程都唤醒。

下面结合一个实际的例子,来演示如何使用 wait 和 notify / notifyAll 方法。

我使用一个数组来模拟一个比较熟悉的数据结构:栈。代码如下所示:

class MyStack{

    private char[] data = new char[5];

    private int index = 0;

    public char pop(){

        index -- ;

        return data[index];

    }

    public void push(char ch){

        data[index] = ch;

        index++;

    }

    public void print(){

        for (int i=0; iindex; i++){

            System.out.print(data[i] + "\t");

        }

        System.out.println();

    }

    public boolean isEmpty(){

        return index == 0;

    }

    public boolean isFull(){

        return index == 5;

    }

}

注意,我们为 MyStack 增加了两个方法,一个用来判断栈是否为空,一个用来判断栈是

否已经满了。

然后我们创建两个线程,一个线程每隔一段随机的时间,就会往栈中增加一个数据;另

一个线程每隔一段随机的时间,就会从栈中取走一个数据。为了保证 push 和 pop 的完整性,在线程中应当对 MyStack 对象加锁。

但是我们发现,入栈线程和出栈线程并不是在任何时候都可以工作的。当数组满了的时

候,入栈线程将不能工作;当数组空了的时候,出栈线程也不能工作。违反了上面的条件,我们将得到一个数组下标越界异常。

为此,我们可以用 wait/notify 机制。在入栈线程执行入栈操作时,如果发现数组已满,

则会调用 wait 方法,去等待。同样,出栈线程在执行出栈操作时,如果发现数组已空,同

样调用 wait 方法去等待。在入栈线程结束入栈工作之后,会调用 notifyAll 方法,释放那些正在等待的出栈线程(因为数组现在已经不是空的了,他们可以恢复工作了)。同样,当出栈线程结束出栈工作之后,也会调用 notifyAll 方法,释放正在等待的入栈线程。

一段生产者/消费者相关代码:

class Consumer extends Thread{

    private MyStack ms;

    public Consumer(MyStack ms) {

        this.ms = ms;

    }

    public void run(){

        while(true){

        //为了保证 push 和 pop 操作的完整性

        //必须加 synchronized

            synchronized(ms){

            //如果栈空间已满,则 wait()释放 ms 的锁标记

                while(ms.isEmpty()){

                    try {

                        ms.wait();

                    } catch (InterruptedException e) {

                        e.printStackTrace();

                    }

                }

                char ch = ms.pop();

                System.out.println("Pop " + ch);

                ms.notifyAll();

            }

            //push 之后随机休眠一段时间

            try {

                sleep( (int)Math.abs(Math.random() * 100) );

            } catch (InterruptedException e) {

                e.printStackTrace();

            }

        }

    }

}

//生产者

class Producer extends Thread{

    private MyStack ms;

    public Producer(MyStack ms) {

        this.ms = ms;

    }

    public void run(){

        while(true){

        //为了保证 push 和 pop 操作的完整性

        //必须加 synchronized

            synchronized(ms){

            //如果栈空间已满,则 wait()释放 ms 的锁标记

                while(ms.isFull()){

                    try {

                        ms.wait();

                    } catch (InterruptedException e) {

                        e.printStackTrace();

                    }

                }

                ms.push('A');

                System.out.println("push A");

                ms.notifyAll();

            }

            //push 之后随机休眠一段时间

            try {

                sleep( (int)Math.abs(Math.random() * 200) );

            } catch (InterruptedException e) {

                e.printStackTrace();

            }

        }

    }

}

//主方法中,启用生产者与消费者两个线程

public class TestWaitNotify {

    public static void main(String[] args) {

        MyStack ms = new MyStack();

        Thread t1 = new Producer(ms);

        Thread t2 = new Consumer(ms);

        t1.start();

        t2.start();

    }

}

部分代码纯手打,望采纳~

java模式有哪些?

工厂模式, 工厂方法模式,单例模式, 外观(Facade)模式, 观察者(Observer)模式,桥接(Bridge)模式都是比较常用的,不同的项目有不同的设计方向,可以参考的设计模式也不尽相同,没有定数,只是上面这几个模式用的比较多一些。

关于java通知模式和的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

The End

发布于:2022-11-26,除非注明,否则均为首码项目网原创文章,转载请注明出处。