您当前的位置:首页 > 互联网教程

java active

发布时间:2025-05-21 17:29:11    发布人:远客网络

java active

一、java active

java active是什么,让我们一起了解一下?

在java中,Active Object模式是一种异步编程模式。它通过对方法的调用与方法的执行进行解耦来提高并发性。它的核心是允许任务的提交(相当于对异步方法的调用)和任务的执行(相当于异步方法的真正执行)分离。

首先从调用方代码来看,调用一个Active Object对象的方法与调用普通Java对象的方法并无太大差别。

1 ActiveObject ao=...; 2 Future future = ao.doSomething("data"); 3 //执行其它操作 4 String result = future.get(); 5 System.out.println(result);

那么Active Object模式的架构是什么,有什么作用?

1、当Active Object模式对外暴露的异步方法被调用时,与该方法调用相关的上下文信息,包括被调用的异步方法名(或其代表的操作)、调用方代码所传递的参数等,会被封装成一个对象。

该对象被称为方法请求(Method Request)。方法请求对象会被存入Active Object模式所维护的缓冲区(Activation Queue)中,并由专门的工作线程负责根据其包含的上下文信息执行相应的操作。

也就是说,方法请求对象是由运行调用方代码的线程通过调用Active Object模式对外暴露的异步方法生成的,而方法请求所代表的操作则由专门的线程来执行,从而实现了方法的调用与执行的分离,产生了并发。

2、Active Object模式的主要参与者有以下几种。

Proxy:负责对外暴露异步方法接口。当调用方代码调用该参与者实例的异步方法doSomething时,该方法会生成一个相应的MethodRequest实例并将其存储到Scheduler所维护的缓冲区中。doSomething方法的返回值是一个表示其执行结果的外包装对象:Future参与者的实例。异步方法doSomething运行在调用方代码所在的线程中。

MethodRequest:负责将调用方代码对Proxy实例的异步方法的调用封装为一个对象。该对象保留了异步方法的名称及调用方代码传递的参数等上下文信息。它使得将Proxy的异步方法的调用和执行分离成为可能。其call方法会根据其所包含上下文信息调用Servant实例的相应方法。

ActivationQueue:负责临时存储由Proxy的异步方法被调用时所创建的MethodRequest实例的缓冲区。

Scheduler:负责将Proxy的异步方法所创建的MethodRequest实例存入其维护的缓冲区中。并根据一定的调度策略,对其维护的缓冲区中的MethodRequest实例进行执行。其调度策略可以根据实际需要来定,如FIFO、LIFO和根据MethodRequest中包含的信息所定的优先级等。

Servant:负责对Proxy所暴露的异步方法的具体实现。

Future:负责存储和返回Active Object异步方法的执行结果。

二、java队列实现异步执行

1、会有很多线程给一个队列上添加任务

2、有一个或者多个线程逐个执行队列的任务

1、没有任务时,队列执行线程处于等待状态

2、添加任务时,激活队列执行线程,全部run起来,首先抢到任务的执行,其他全部wait

publicstaticList<Task>queue=newLinkedList<Task>();

Queues.queue.add(t);//添加任务

Queues.queue.notifyAll();//激活该队列对应的执行线程,全部Run起来

System.out.println("我被执行了");

publicclassExecimplementsRunnable{

while(Queues.queue.isEmpty()){//

Queues.queue.wait();//队列为空时,使线程处于等待状态

}catch(InterruptedExceptione){

System.out.println("wait...");

Queues.Taskt=Queues.queue.remove(0);//得到第一个

publicstaticvoidmain(String[]args){

newThread(e).start();//开始执行时,队列为空,处于等待状态

//上面开启两个线程执行队列中的任务,那就是先到先得了

Queues.Taskt=newQueues.Task();

Queues.add(t);//执行该方法,激活所有对应队列,那两个线程就会开始执行啦

}

上面的就是很简单的例子了

三、java中实现线程的方法有哪些

1、以前在远标学过有三种:(1)继承Thread类,重写run函数

2、Thread.sleep(1000)//线程休眠1000毫秒,sleep使线程进入Block状态,并释放资源

3、对象.start()//启动线程,run函数运行

4、(2)实现Runnable接口,重写run函数

5、Thread t= new Thread(对象)//创建线程对象

6、(3)实现Callable接口,重写call函数

7、Callable是类似于Runnable的接口,实现Callable接口的类和实现Runnable的类都是可被其它线程执行的任务。

8、①Callable规定的方法是call(),而Runnable规定的方法是run().

9、②Callable的任务执行后可返回值,而Runnable的任务是不能返回值的

10、③call()方法可抛出异常,而run()方法是不能抛出异常的。

11、④运行Callable任务可拿到一个Future对象,Future表示异步计算的结果。它提供了检查计算是否完成的方法,以等

12、待计算的完成,并检索计算的结果.通过Future对象可了解任务执行情况,可取消任务的执行,还可获取任务执行的结果