免费A级毛片无码专区网站-成人国产精品视频一区二区-啊 日出水了 用力乖乖在线-国产黑色丝袜在线观看下-天天操美女夜夜操美女-日韩网站在线观看中文字幕-AV高清hd片XXX国产-亚洲av中文字字幕乱码综合-搬开女人下面使劲插视频

Java 19 新功能介紹( 二 )


看到這里你可能要說了,可以放棄請求和線程一一對應(yīng)的方式啊,使用異步編程來解決這個問題,把請求處理分段,在組合成順序管道,通過一套 API 進(jìn)行管理,這樣就可以使用有限的線程來處理超過線程數(shù)量的請求 。這當(dāng)然也是可以的,但是隨之而來的問題是:

  • 需要額外的學(xué)習(xí)異步編程 。
  • 代碼復(fù)雜度增加,等于放棄了語言的基本順序組合運(yùn)算 。
  • 堆棧上下文信息都變得難以追蹤 。
  • Debug 困難 。
  • 和 Java 平臺本身的編程風(fēng)格有沖突,Java 并發(fā)單元是 Thread,而這時是異步管道 。
虛擬線程基于上面的種種原因,Java 19 引入了虛擬線程,在使用體驗上和 Thread 沒有區(qū)別,與之前的 API 互相兼容,但是相比之下虛擬線程資源占用非常少,同時優(yōu)化了硬件的使用效率,因此非常易用且不需要被池化 。
下面是一個示例,創(chuàng)建 10 萬個線程,然后都休眠 1 秒鐘最后打印耗時,如果是開傳統(tǒng)的 Thread 線程的方式,資源十分緊張;如果是線程池的方式,必定有部分線程在等待線程釋放;但是使用虛擬線程的方式,可以瞬間完成 。
import java.util.concurrent.Executors;import java.util.stream.IntStream;public class ThreadTest {public static void main(String[] args) {long start = System.currentTimeMillis();try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {IntStream.range(0, 100_000).forEach(i -> {executor.submit(() -> {Thread.sleep(1000);return i;});});} // executor.close() 會被自動調(diào)用// 提交了 10 萬個虛擬線程,每個線程休眠 1 秒鐘,1秒左右完成System.out.println("耗時:" + (System.currentTimeMillis() - start)+"ms");}}執(zhí)行后發(fā)現(xiàn) 1.3 秒執(zhí)行完畢,速度驚人 。
【Java 19 新功能介紹】?bin ./java --enable-preview --source 19ThreadTest.java注: ThreadTest.java 使用 Java SE 19 的預(yù)覽功能 。注: 有關(guān)詳細(xì)信息,請使用 -Xlint:preview 重新編譯 。耗時:1309ms?bin注意:虛擬線程只是增加程序的吞吐量,并不能提高程序的處理速度 。
JEP 427: switch 模式匹配 (三次預(yù)覽)Switch 模式匹配在 Java 17 中已經(jīng)引入,在 Java 18 中二次預(yù)覽,現(xiàn)在在 Java 19 中進(jìn)行三次預(yù)覽,功能和在 Java 18 新功能介紹 - Switch 中介紹的一樣,改進(jìn)后的 Switch 模式匹配可以代碼更加簡潔,邏輯更加清晰,下面是一些使用示例對比 。
下面是幾個例子:
// JDK 17 以前static String formatter(Object o) {String formatted = "unknown";if (o instanceof Integer i) {formatted = String.format("int %d", i);} else if (o instanceof Long l) {formatted = String.format("long %d", l);} else if (o instanceof Double d) {formatted = String.format("double %f", d);} else if (o instanceof String s) {formatted = String.format("String %s", s);}return formatted;}而在 Java 17 之后,可以通過下面的寫法進(jìn)行改進(jìn):
// JDK 17 之后static String formatterPatternSwitch(Object o) {return switch (o) {case Integer i -> String.format("int %d", i);case Long l-> String.format("long %d", l);case Double d-> String.format("double %f", d);case String s-> String.format("String %s", s);default-> o.toString();};}switch 可以和 null 進(jìn)行結(jié)合判斷:
static void testFooBar(String s) {switch (s) {case null-> System.out.println("Oops");case "Foo", "Bar" -> System.out.println("Great");default-> System.out.println("Ok");}}case 時可以加入復(fù)雜表達(dá)式:
static void testTriangle(Shape s) {switch (s) {case Triangle t && (t.calculateArea() > 100) ->System.out.println("Large triangle");default ->System.out.println("A shape, possibly a small triangle");}}case 時可以進(jìn)行類型判斷:
sealed interface S permits A, B, C {}final class A implements S {}final class B implements S {}record C(int i) implements S {}// Implicitly finalstatic int testSealedExhaustive(S s) {return switch (s) {case A a -> 1;case B b -> 2;case C c -> 3;};}

經(jīng)驗總結(jié)擴(kuò)展閱讀