katakanlah saya punya metode doWork()
. Bagaimana cara menyebutnya dari utas terpisah (bukan utas utama).
java
multithreading
Louis Rhys
sumber
sumber
Jawaban:
Buat kelas yang mengimplementasikan
Runnable
antarmuka. Letakkan kode yang ingin Anda jalankan dirun()
metode - itulah metode yang harus Anda tulis untuk mematuhiRunnable
antarmuka. Dalam utas "utama" Anda, buatThread
kelas baru , meneruskan konstruktor sebuah instance dari AndaRunnable
, lalu memanggilnyastart()
.start
memberi tahu JVM untuk melakukan keajaiban untuk membuat utas baru, lalu memanggilrun
metode Anda di utas baru tersebut.Lihatlah Jawa concurrency tutorial untuk memulai.
Jika metode Anda akan sering dipanggil, mungkin tidak ada gunanya membuat utas baru setiap kali, karena ini adalah operasi yang mahal. Mungkin akan lebih baik jika menggunakan semacam kumpulan utas. Silahkan lihat pada
Future
,Callable
,Executor
kelas dalamjava.util.concurrent
paket.sumber
run()
Metode tidak mengambil parameter, sehingga Anda tidak dapat melewati sebuah variabel di sana. Saya sarankan Anda meneruskannya di konstruktor - Saya akan mengedit jawaban saya untuk menunjukkannya.new Thread() { public void run() {myMethod();}}.start();
jalannya, apakah itu yang terpendek?Runnable
- milikku adalah kelas yang diperluasRunnable
. Dan karena saya telah melakukannya, saya memiliki konstruktor sendiri yang meneruskan status ke objek yang dipakai.atau
atau
atau
atau
sumber
run()
?Di Java 8 Anda dapat melakukan ini dengan satu baris kode.
Jika metode Anda tidak mengambil parameter apa pun, Anda dapat menggunakan referensi metode:
Jika tidak, Anda bisa memanggil metode dalam ekspresi lambda:
sumber
->
artinya?Celery task queue
untuk halOpsi lain yang lebih cepat untuk memanggil sesuatu (seperti DialogBoxes dan MessageBoxes dan membuat utas terpisah untuk metode aman bukan utas) adalah dengan menggunakan Ekspresi Lamba
sumber
Beberapa waktu yang lalu, saya telah menulis kelas utilitas sederhana yang menggunakan layanan pelaksana JDK5 dan menjalankan proses tertentu di latar belakang. Karena doWork () biasanya memiliki nilai pengembalian void, Anda mungkin ingin menggunakan kelas utilitas ini untuk mengeksekusinya di latar belakang.
Lihat artikel ini di mana saya telah mendokumentasikan utilitas ini.
sumber
Untuk mencapai ini dengan RxJava 2.x Anda dapat menggunakan:
The
subscribeOn()
Metode menentukan yang scheduler untuk menjalankan aksi di - RxJava memiliki beberapa penjadwal yang telah ditetapkan, termasukSchedulers.io()
yang telah thread kolam renang yang ditujukan untuk I / O operasi, danSchedulers.computation()
yang dimaksudkan untuk operasi intensif CPU.sumber
Jika Anda menggunakan setidaknya Java 8, Anda dapat menggunakan metode
runAsync
dari kelas CompletableFutureJika Anda perlu kembali penggunaan hasil
supplyAsync
bukansumber