首頁 > Java > java教程 > 主體

Java 協程

王林
發布: 2024-08-30 15:58:11
原創
800 人瀏覽過

Java 協程被定義為一組指令,透過將其打包為一個單元來發送到計算機,用於概括要透過多任務處理風格執行的特定任務,其中沒有從正在運行的進程切換到正在運行的進程。其他進程,而是將其作為協作多任務同時運行。這些指令是透過允許它們暫停和恢復來執行的。我們非常熟悉透過協同例程、協作任務、事件循環、迭代器、管道等編寫的程式類型。然而,人們通常會對協同例程的概念相對於子例程、執行緒、生成器等其他概念感到困惑。 ,相互遞歸。

廣告 該類別中的熱門課程 JAVA 掌握 - 專業化 | 78 課程系列 | 15 次模擬測驗

開始您的免費軟體開發課程

網頁開發、程式語言、軟體測試及其他

Java 協程的語法

下面給的是提到的語法:

1。在 POM 中輸入依賴項。

<dependency>
<groupId> {package name goes here} </groupId>
<artifactId> {artifact ID goes here} </artifactId>
<version> {version number goes here} </version>
</dependency>
登入後複製

2。聲明協程的類別實例。

public static final class < Class name goes here > implements Coroutine
登入後複製

3。覆蓋父類別的實作。

@Override
登入後複製

4。透過 com.offbynull.coroutines 聲明協程。

CoroutineRunnerr = new CoroutineRunner(new <class name> ());
登入後複製

協程在 Java 中如何運作?

在了解 Java 中的協程之前,讓我們先來看看實作相同內容的不同方法,因為不同的方法將決定純 Java 中協程的工作方式。事實上,Java 的抽象施加了一些限制,但實作並沒有停止實作。

廣受接受的,有 4 種方法負責協程的實現。

  • 為了原生支援協程,修改了 JVM,並對其進行了修補以關心協程的實作。達文西機器專案就是此類修改後的 JVM 之一。
  • 透過重寫常規字節碼,還可以實現協程功能。這些例程可以在執行時間或在編譯時處理。目前存在多種實作方式。來自 offbynull、Google 程式碼存檔和/或 Apache commons。
  • 還可以透過特定於平台的機制實現 Java 本機接口,並在 OS 或 C 庫中實現,並幫助提供 JVM 功能。
  • 最後但並非最不重要的一點是,協程也可以使用執行緒來實現,儘管效能很大程度上取決於 JVM 的執行緒實作。

協程是輕量級線程,它們透過共享現有線程而不是擁有專用的系統線程來運行。這種協作方式透過共享來運行,並確保共享執行緒不會被佔用過多。 Java 7 中的 ForkJoinTask 和 Java 8 中的 CompletableFuture 提供了有關共享執行緒執行的明確支援。現在,如果協程暫停不確定的時間,則不會使用任何計算資源,並且只有在等待的資源可用時才能恢復執行。

我們的第一個任務是聲明協程。缺乏一種本地機制來聲明任何包含暫停的物件;唯一的方法是透過 API 來實現它。它可以被宣告為協程類別的實例,而 esoco GmBH 提供了 Coroutine.first( ) 方法來呼叫新的協程實例。或者,可以呼叫建構函式實例來執行相同的任務。使用 Coroutine.then( ) 使用者可以提供額外的功能來補充。協程的另一個主要特徵是它們是不可變的,並且定義的步驟順序無法更改。

使用CoroutineWriter和CoroutineReader,可以對協程進行序列化或反序列化。預設使用 Java 內建的序列化函數,且協程的狀態是使用該函數構成的。除此之外,還有自訂實作來進一步控制序列化或反序列化,並傳遞給CoroutineWriter 和CoroutineReader 以添加不同的序列化格式(如XML、JSON)或不同的序列化程式(如XStream、Kryo 、Jackson 等)

序列化是一項高階功能,強烈建議熟悉 JVM 位元組程式碼。序列化的概念允許將協程轉換為位元組數組並從位元組數組轉換回來。

序列化的典型用例是:

  • Using serialization, one can cache or checkpoint to a disk and write it back again.
  • Over the wire coroutine transmission.
  • Coroutine forking.

Another derivative of serialization is the versioning which enables developers to change the logic of coroutine along side still being able to load data using serialization from earlier versions.

Examples of Java Coroutines

Given below are the examples of Java Coroutines:

Example #1

A “Hello World” type example coroutines.

Syntax:

public static final class CoroutineDemo implements Coroutine {
@Override
public void run(Continuation c) {
System.out.println("Start of Main stream ");
for (int i = 0; i < 10; i++) {
echo(c, i);
}
}
private void echo(Continuation c, int x) {
System.out.println(x);
c.suspend();
}
}
CoroutineRunner runnerVar = new CoroutineRunner(new CoroutineDemo());
runnerVar.execute();
runnerVar.execute();
runnerVar.execute();
runnerVar.execute();
登入後複製

Output:

Java 協程

Example #2

Forking of an object.

Syntax:

public final class CoroutineDemo implements Coroutine {
@Override
public void run(Continuation c) {
System.out.println("Start of Main stream");
for (int i = 0; i < 10; i++) {
echo(c, i);
}
}
private void echo(Continuation c, int x) {
System.out.println(x);
c.suspend();
}
}
CoroutineRunner runner1 = new CoroutineRunner(new CoroutineDemo());
runner1.execute();
byte[] dumped = new CoroutineWriter().write(runner1);
CoroutineRunner runner2 = new CoroutineReader().read(dumped);
runner1.execute();
runner2.execute();
runner1.execute();
runner2.execute();
runner1.execute();
runner2.execute();
登入後複製

Output:

Java 協程

Conclusion

Through this article, we have looked at the working of Java coroutines. First, one needs to make sure that the POM and details of the maven build are properly instantiated and the build is done. With the different use case of a simple one and the forking, we are able to understand how 2 variables carry the information and if something gets updated in the root, the same thing is reflected back into the fork as well through serialization.

以上是Java 協程的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!