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:
RunnableArabirimi uygulayan bir sınıf oluşturun . Çalıştırmak istediğiniz kodu run()yönteme koyun - Runnablearayüze uymak için yazmanız gereken yöntem budur . "Ana" iş parçacığınızda, yeni bir Threadsınıf oluşturun, kurucuya kendi örneğinizin bir örneğini iletin Runnable, ardından start()onu çağırın . startJVM'ye yeni bir iş parçacığı oluşturmak için sihir yapmasını ve ardından runbu 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, Executorsınıfların java.util.concurrentpakette.
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 queueAsenkron ş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 supplyAsyncbunun yerine kullanın
CompletableFuture.supplyAsync(() -> 1);