java执行方式 client/server

java -client xxx

java -server xxx

上面两种为java程序的执行方式,使用java -version可以看到默认使用的是client执行

使用server模式,编译器会对程序进行优化,具体说明如下:

可以对指令进行优化,也可对其他,如

比如垃圾回收机制,客户端模式下,要求的是用户体验流程,无明显滞留感(就是没有卡的现象)
而服务端,要求的是吞吐量,就是单位时间内执行的代码要求越多越好,

执行1万次代码,一种垃圾回收策略是每隔1000行停顿一次用来做垃圾回收,回收时间10毫秒,那么总共耗停顿时间是100毫秒(10*10)
而另一种是,每隔2000行停顿一次用作垃圾回收,回收时间15毫秒,总共停顿时间耗时是75毫秒(15*5)
这个例子中,后一种方案的吞吐量高,而前一种法案的停顿时间短。

当然,server 和 client 还有其他地方的区别,比如,代码优化策略,等等


但是优化后,可能会遇到指令重排的情况,可能会导致程序执行和预想的不一样。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java 中实现 gRPC 的异步调用可以采用回调(callback)方式。下面是一个简单的示例: 1. 首先在服务端实现一个异步方法: ```java public class MyServiceImpl extends MyServiceGrpc.MyServiceImplBase { @Override public void myMethod(MyRequest request, StreamObserver<MyResponse> responseObserver) { // 异步执行任务 ListenableFuture<MyResponse> future = executor.submit(() -> { // 执行任务 MyResponse response = doTask(request); return response; }); // 注册回调 Futures.addCallback(future, new FutureCallback<MyResponse>() { @Override public void onSuccess(MyResponse response) { // 将结果返回给客户端 responseObserver.onNext(response); responseObserver.onCompleted(); } @Override public void onFailure(Throwable t) { // 异常处理 responseObserver.onError(t); } }); } private MyResponse doTask(MyRequest request) { // 执行任务 return MyResponse.newBuilder().setMessage("Hello " + request.getName()).build(); } } ``` 2. 在客户端异步调用服务端的方法: ```java public class MyClient { private final ManagedChannel channel; private final MyServiceGrpc.MyServiceStub stub; public MyClient(String host, int port) { channel = ManagedChannelBuilder.forAddress(host, port).usePlaintext().build(); stub = MyServiceGrpc.newStub(channel); } public void myMethodAsync(MyRequest request, StreamObserver<MyResponse> responseObserver) { // 发送请求 stub.myMethod(request, responseObserver); } public void shutdown() throws InterruptedException { channel.shutdown().awaitTermination(5, TimeUnit.SECONDS); } } ``` 3. 最后,在客户端调用异步方法: ```java public class TestClient { public static void main(String[] args) throws Exception { MyClient client = new MyClient("localhost", 8888); // 异步调用 CountDownLatch latch = new CountDownLatch(1); StreamObserver<MyResponse> responseObserver = new StreamObserver<MyResponse>() { @Override public void onNext(MyResponse response) { System.out.println("Received response: " + response.getMessage()); } @Override public void onError(Throwable t) { System.err.println("Error: " + t.getMessage()); latch.countDown(); } @Override public void onCompleted() { latch.countDown(); } }; client.myMethodAsync(MyRequest.newBuilder().setName("World").build(), responseObserver); // 等待异步调用完成 latch.await(); client.shutdown(); } } ``` 以上就是一个简单的 gRPC 异步调用的实现示例,通过回调方式可以方便地处理异步调用的结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值