ホームページ  >  記事  >  Java  >  Java同期、非同期、ブロッキングおよびノンブロッキング分析

Java同期、非同期、ブロッキングおよびノンブロッキング分析

高洛峰
高洛峰オリジナル
2017-02-11 16:17:391382ブラウズ

この記事では、主に Java 同期、非同期、ブロッキングおよびノンブロッキング分析の関連情報を紹介します。必要な方は、

Java 同期、非同期、ブロッキングおよびノンブロッキング分析を参照してください

概要:

通常 この場合、プログラムは同期かつノンブロッキング方式で実行されます。ただし、プログラムには、複雑な計算 (1 ~ 10 億の素数を求める) やプログラム自体では制御できない操作 (IO 操作、ネットワーク リクエスト) など、時間のかかる操作が常に含まれます。これらの時間のかかる操作を含むメソッドをブロッキング メソッドと呼ぶことができ、これらの時間のかかる操作を含むタスクをブロッキング タスクと呼ぶことができます。ブロッキングとノンブロッキングは、時間がかかるかどうかによって定義されます。

プログラム内に多数のブロック操作がある場合、プログラムのパフォーマンスに影響します。しかし、ブロックの存在は客観的な事実であり、私たちのプログラムはそれを変更することはできません。ネットワークリクエストの応答には 3 秒かかります。リクエストを受け入れるサーバーが完全に停止している可能性があるため、1 ミリ秒以内に応答させることは不可能です。私たちのコントロールの。ただし、ブロッキングの処理方法を変更することはできます。つまり、ブロッキング タスクを非同期で処理します。非同期を実現する主なテクノロジーはマルチスレッドです。図:

java 同步、异步、阻塞和非阻塞分析

同期と非同期はタイミングの概念です。同期とは同時に 1 つのタスクのみを実行することを意味し、非同期とは複数のタスクを同時に実行することを意味します。

コード例

ネットワークリクエストのシミュレーション:

package com.zzj.asyn; 
 
public class HttpRequest { 
  private Callable callable; 
   
  public HttpRequest(Callable callable) { 
    this.callable = callable; 
  } 
   
  public void send(){ 
    // 模拟网络请求 
    try { 
      Thread.sleep(1000 * 5); 
    } catch (InterruptedException e) { 
      e.printStackTrace(); 
      Thread.currentThread().interrupt(); 
    } 
    // 回调 
    this.callable.call("Hello world!"); 
  } 
   
  public interface Callable{ 
    void call(String result); 
  } 
}

ブロッキングタスクの同期処理:

package com.zzj.asyn; 
 
import com.zzj.asyn.HttpRequest.Callable; 
 
/** 
 * 以同步的方式处理阻塞任务 
 * @author lenovo 
 * 
 */ 
public class App { 
  public static void main(String[] args) { 
    new HttpRequest(new Callable() { 
      @Override 
      public void call(String result) { 
        System.out.println("Thread:" + Thread.currentThread().getName()); 
        System.out.println("Message from remote server:" + result); 
      } 
    }).send(); 
    System.out.println("Thread " + Thread.currentThread().getName() + " is over!"); 
  } 
}

結果:

Thread:main 
Message from remote server:Hello world! 
Thread main is over!

ハンドルブロックありタスクを非同期的に実行:

package com.zzj.asyn; 
 
import com.zzj.asyn.HttpRequest.Callable; 
 
/** 
 * 以异步的方式处理阻塞任务 
 * @author lenovo 
 * 
 */ 
public class App2 { 
  public static void main(String[] args) { 
    new Thread(new Runnable() { 
      @Override 
      public void run() { 
        new HttpRequest(new Callable() { 
          @Override 
          public void call(String result) { 
            System.out.println("Thread:" + Thread.currentThread().getName()); 
            System.out.println("Message from remote server:" + result); 
          } 
        }).send(); 
      } 
    }).start(); 
    System.out.println("Thread " + Thread.currentThread().getName() + " is over!"); 
  } 
}

結果:

Thread main is over! 
Thread:Thread-0 
Message from remote server:Hello world!

読んでいただきありがとうございます。皆さんのお役に立てれば幸いです。このサイトのご支援に感謝します。

Java 同期、非同期、ブロッキングおよびノンブロッキング分析に関連するその他の記事については、PHP 中国語 Web サイトに注目してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。