katakanlah saya punya metode doWork()
. Bagaimana cara menyebutnya dari utas terpisah (bukan utas utama).
katakanlah saya punya metode doWork()
. Bagaimana cara menyebutnya dari utas terpisah (bukan utas utama).
Jawaban:
Buat kelas yang mengimplementasikan Runnable
antarmuka. Letakkan kode yang ingin Anda jalankan di run()
metode - itulah metode yang harus Anda tulis untuk mematuhi Runnable
antarmuka. Dalam utas "utama" Anda, buat Thread
kelas baru , meneruskan konstruktor sebuah instance dari Anda Runnable
, lalu memanggilnya start()
. start
memberi tahu JVM untuk melakukan keajaiban untuk membuat utas baru, lalu memanggil run
metode Anda di utas baru tersebut.
public class MyRunnable implements Runnable {
private int var;
public MyRunnable(int var) {
this.var = var;
}
public void run() {
// code in the other thread, can reference "var" variable
}
}
public class MainThreadClass {
public static void main(String args[]) {
MyRunnable myRunnable = new MyRunnable(10);
Thread t = new Thread(myRunnable)
t.start();
}
}
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 dalam java.util.concurrent
paket.
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 diperluas Runnable
. Dan karena saya telah melakukannya, saya memiliki konstruktor sendiri yang meneruskan status ke objek yang dipakai.
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
// code goes here.
}
});
t1.start();
atau
new Thread(new Runnable() {
@Override
public void run() {
// code goes here.
}
}).start();
atau
new Thread(() -> {
// code goes here.
}).start();
atau
Executors.newSingleThreadExecutor().execute(new Runnable() {
@Override
public void run() {
myCustomMethod();
}
});
atau
Executors.newCachedThreadPool().execute(new Runnable() {
@Override
public void run() {
myCustomMethod();
}
});
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:
new Thread(MyClass::doWork).start();
Jika tidak, Anda bisa memanggil metode dalam ekspresi lambda:
new Thread(() -> doWork(someParam)).start();
->
artinya?
Celery task queue
untuk hal
Opsi 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
new Thread(() -> {
"code here"
}).start();
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.
Untuk mencapai ini dengan RxJava 2.x Anda dapat menggunakan:
Completable.fromAction(this::dowork).subscribeOn(Schedulers.io().subscribe();
The subscribeOn()
Metode menentukan yang scheduler untuk menjalankan aksi di - RxJava memiliki beberapa penjadwal yang telah ditetapkan, termasuk Schedulers.io()
yang telah thread kolam renang yang ditujukan untuk I / O operasi, dan Schedulers.computation()
yang dimaksudkan untuk operasi intensif CPU.
Jika Anda menggunakan setidaknya Java 8, Anda dapat menggunakan metode runAsync
dari kelas CompletableFuture
CompletableFuture.runAsync(() -> {...});
Jika Anda perlu kembali penggunaan hasil supplyAsync
bukan
CompletableFuture.supplyAsync(() -> 1);