Artikel ini terutama mengeksplorasi penggunaan pemrograman bersamaan Java yang dapat dipanggil dan masa depan, dan berbagi kode contoh yang relevan, dan detailnya adalah sebagai berikut.
Kita semua tahu bahwa ada dua cara untuk menerapkan multi-threading. Salah satunya adalah mewarisi utas dan yang lainnya adalah menerapkan Runnable. Namun, kedua cara ini memiliki cacat, dan hasil pengembalian tidak dapat diperoleh setelah tugas selesai. Untuk mendapatkan hasil pengembalian, Anda harus menggunakan Callable. Tugas yang dapat dipanggil dapat memiliki nilai pengembalian, tetapi tidak dapat secara langsung mendapatkan nilai pengembalian dari tugas yang dapat dipanggil; Jika Anda ingin mendapatkan nilai pengembalian dari tugas yang dapat dipanggil, Anda perlu menggunakan masa depan. Jadi tugas yang dapat dipanggil dan mode masa depan biasanya digunakan dalam kombinasi.
Bayangkan sebuah skenario: Anda memerlukan antarmuka daftar posting. Selain mengembalikan daftar posting, Anda juga perlu mengembalikan daftar sejenis dan komentar setiap posting. Untuk perhitungan 10 posting di halaman, antarmuka ini membutuhkan akses ke database 21 kali. Setelah mengakses database dihitung berdasarkan 100ms, 21 kali, dan waktu kumulatif adalah 2.1s. Waktu respons ini mungkin tidak memuaskan. Apa yang harus dilakukan? Transformasi antarmuka yang tidak sinkron.
Setelah mencari tahu daftar posting, beralih ke daftar posting, mulai 10 utas di loop, dan secara bersamaan dapatkan daftar sejenis dari setiap posting, dan pada saat yang sama, 10 utas diatur untuk mendapatkan daftar komentar dari setiap posting. Setelah transformasi ini, waktu respons antarmuka sangat dipersingkat menjadi 200ms. Pada saat ini, kita perlu menggunakan Callabel yang dikombinasikan dengan masa depan untuk mencapainya.
Daftar Pribadi <Postresponse> createPoStresponsElist (halaman <Ostresponse> halaman, final string userid) {if (page.getCount () == 0 || page == null || page.getList () == null) {return null; } // Dapatkan daftar posting daftar <Ostresponse> circleresponseList = page.getList (); ukuran int = circleresponselist.size (); ExecutorService commentpool = executors.newfixedThreadpool (size); ExecutorService SupportPool = executors.newfixedThreadPool (size); Coba {List <Tepond> CommentFutureList = new ArrayList <Tound> (size); if (circleresponselist! = null && circleresponselist.size ()> 0) {for (postresponse postresponse: circleresponselist) {final string circleId = postresponse.getid (); string final postuserid = postresponse.getUserId (); // Periksa daftar komentar Callable <Daftar <siriseeviews>> callablecomment = baru Callable <List <CircleViews>> () {@Override List Public <cirkleViews> call () melempar Exception {return circleViewsbiz.getPostComments (circleId); }}; Future f = CommentPool.submit (Callablecomment); CommentFuturelist.Add (f); // Periksa daftar seperti Callable <List <cirundzan>> callablesupport = baru Callable <List <irderzan>> () {@Override Public List <dirgezan> call () melempar Exception {return CircleZanBiz.findlist (CircleId); }}; Future SupportFuture = SupportPool.Submit (Callablesupport); CommentFuturelist.Add (SupportFuture); }} // Dapatkan hasil eksekusi dari semua tugas bersamaan int i = 0; Postresponse Temp = null; untuk (masa depan f: CommentFutureList) {temp = circleresponselist.get (i); temp.setCommentList ((daftar <sirat <circleViews>) f.get (); temp.setsupportlist ((Daftar <sirat <cirkzan>) f.get (); circleresponselist.set (i, temp); i ++;}} catch (pengecualian e) {e.printstack ();} {{{{ExceptEcdow Exception E) supportpool.shutdown ();Meringkaskan
Di atas adalah seluruh konten artikel ini tentang contoh kode aplikasi dari pemrograman bersamaan Java yang dapat dipanggil dan masa depan. Saya harap ini akan membantu semua orang. Teman yang tertarik dapat terus merujuk ke topik terkait lainnya di situs ini. Jika ada kekurangan, silakan tinggalkan pesan untuk menunjukkannya. Terima kasih teman atas dukungan Anda untuk situs ini!