diyelim ki bir yöntemim var doWork()
. Nasıl ayrı bir iş parçacığından (ana iş parçacığından değil) çağırırım.
diyelim ki bir yöntemim var doWork()
. Nasıl ayrı bir iş parçacığından (ana iş parçacığından değil) çağırırım.
Yanıtlar:
Runnable
Arabirimi uygulayan bir sınıf oluşturun . Çalıştırmak istediğiniz kodu run()
yönteme koyun - Runnable
arayüze uymak için yazmanız gereken yöntem budur . "Ana" iş parçacığınızda, yeni bir Thread
sınıf oluşturun, kurucuya kendi örneğinizin bir örneğini iletin Runnable
, ardından start()
onu çağırın . start
JVM'ye yeni bir iş parçacığı oluşturmak için sihir yapmasını ve ardından run
bu yeni iş parçacığında yönteminizi çağırmasını söyler.
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();
}
}
Başlamak için Java'nın eşzamanlılık eğitimine bir göz atın .
Yönteminiz sık sık çağrılacaksa, bu pahalı bir işlem olduğu için her seferinde yeni bir iş parçacığı oluşturmaya değmeyebilir. Bir tür iş parçacığı havuzu kullanmak muhtemelen en iyisi olacaktır. Göz at Future
, Callable
, Executor
sınıfların java.util.concurrent
pakette.
run()
Orada bir değişken geçemez böylece yöntem, herhangi bir parametre alır. Bunu kurucuda iletmenizi öneririm - bunu göstermek için cevabımı düzenleyeceğim.
new Thread() { public void run() {myMethod();}}.start();
Yolu biliyorum , bu en kısa olanı mı?
Runnable
- benimki genişleyen bir sınıftır Runnable
. Ve bunu yaptığım için durumu örneklenen nesneye geçiren kendi kurucum var.
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
// code goes here.
}
});
t1.start();
veya
new Thread(new Runnable() {
@Override
public void run() {
// code goes here.
}
}).start();
veya
new Thread(() -> {
// code goes here.
}).start();
veya
Executors.newSingleThreadExecutor().execute(new Runnable() {
@Override
public void run() {
myCustomMethod();
}
});
veya
Executors.newCachedThreadPool().execute(new Runnable() {
@Override
public void run() {
myCustomMethod();
}
});
run()
mi sona eriyor ?
Java 8'de bunu bir satır kodla yapabilirsiniz.
Yönteminiz herhangi bir parametre almıyorsa, bir yöntem referansı kullanabilirsiniz:
new Thread(MyClass::doWork).start();
Aksi takdirde, yöntemi bir lambda ifadesinde çağırabilirsiniz:
new Thread(() -> doWork(someParam)).start();
->
geliyor?
Celery task queue
Asenkron şeyler için kullanacağımız Python dünyasından geliyorum
Bir şeyleri çağırmak için daha hızlı bir seçenek (DialogBoxes ve MessageBoxes gibi ve iş parçacığı güvenli olmayan yöntemler için ayrı iş parçacıkları oluşturmak gibi) Lamba İfadesini kullanmak olacaktır.
new Thread(() -> {
"code here"
}).start();
Bir süre önce, JDK5 yürütme hizmetini kullanan ve arka planda belirli işlemleri yürüten basit bir yardımcı program sınıfı yazmıştım. DoWork () genellikle bir void dönüş değerine sahip olacağından, arka planda yürütmek için bu yardımcı program sınıfını kullanmak isteyebilirsiniz.
Bu yardımcı programı belgelediğim bu makaleye bakın .
Bunu RxJava 2.x ile başarmak için şunları kullanabilirsiniz:
Completable.fromAction(this::dowork).subscribeOn(Schedulers.io().subscribe();
subscribeOn()
Hangi zamanlayıcı yöntemi belirtir harekete çalıştırmak için - RxJava dahil olmak üzere birçok önceden tanımlı schedulers sahip Schedulers.io()
havuz I / O işlemleri ve amaçlanan bir iş parçacığı olan Schedulers.computation()
hangi işlemci yoğun operasyonlar için tasarlanmıştır.
En az Java 8 kullanıyorsanız, CompletableFuturerunAsync
sınıfından yöntemi kullanabilirsiniz.
CompletableFuture.runAsync(() -> {...});
Bir sonuç döndürmeniz gerekiyorsa supplyAsync
bunun yerine kullanın
CompletableFuture.supplyAsync(() -> 1);