скажімо, у мене є метод doWork()
. Як я називаю це з окремої нитки (не з головної нитки).
скажімо, у мене є метод doWork()
. Як я називаю це з окремої нитки (не з головної нитки).
Відповіді:
Створіть клас, який реалізує Runnable
інтерфейс. Покладіть код, який потрібно запустити в run()
методі - це метод, який ви повинні написати, щоб відповідати Runnable
інтерфейсу. У своєму "головному" потоці створіть новий Thread
клас, передавши конструктору екземпляр свого Runnable
, а потім зателефонуйте start()
на нього. start
каже JVM зробити магію для створення нової нитки, а потім викликає ваш run
метод у цій новій нитці.
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();
}
}
Погляньте на підручник з питань конкурентоспроможності Java, щоб розпочати роботу.
Якщо ваш метод буде називатися часто, то, можливо, не варто кожного разу створювати нову нитку, оскільки це дорога операція. Напевно, найкраще використовувати якийсь пул потоків. Подивіться Future
, Callable
, Executor
класів в java.util.concurrent
пакеті.
run()
Метод не приймає ніяких параметрів, так що ви не можете передати змінну там. Я б запропонував передати це в конструктор - я відредагую свою відповідь, щоб це показати.
new Thread() { public void run() {myMethod();}}.start();
спосіб, це найкоротший?
Runnable
- мій клас, який розширюється Runnable
. І тому, що я це зробив, у мене є власний конструктор, який передає стан в об'єкт, що створюється.
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
// code goes here.
}
});
t1.start();
або
new Thread(new Runnable() {
@Override
public void run() {
// code goes here.
}
}).start();
або
new Thread(() -> {
// code goes here.
}).start();
або
Executors.newSingleThreadExecutor().execute(new Runnable() {
@Override
public void run() {
myCustomMethod();
}
});
або
Executors.newCachedThreadPool().execute(new Runnable() {
@Override
public void run() {
myCustomMethod();
}
});
run()
?
У Java 8 це можна зробити за допомогою одного рядка коду.
Якщо ваш метод не приймає жодних параметрів, ви можете використовувати посилання на метод:
new Thread(MyClass::doWork).start();
В іншому випадку ви можете викликати метод у лямбда-виразі:
new Thread(() -> doWork(someParam)).start();
->
означає?
Celery task queue
для асинхронних речей
Ще одним швидшим варіантом виклику речей (наприклад, DialogBoxes та MessageBoxes та створення окремих потоків для безпечних методів, що не стосуються потоків) буде використання Lamba Expression
new Thread(() -> {
"code here"
}).start();
Колись тому я написав простий клас утиліти, який використовує службу виконавця JDK5 та виконує конкретні процеси у фоновому режимі. Оскільки doWork () зазвичай має значення недійсного повернення, ви можете використовувати цей клас утиліти для його виконання у фоновому режимі.
Дивіться цю статтю, де я задокументував цю утиліту.
Щоб досягти цього за допомогою RxJava 2.x, ви можете використовувати:
Completable.fromAction(this::dowork).subscribeOn(Schedulers.io().subscribe();
У subscribeOn()
методі визначає , який планувальник для запуску дії на - RxJava має низку визначених планувальників, в тому числі , Schedulers.io()
який має пул потоки , призначені для операцій введення / виводу, і Schedulers.computation()
яка призначена для процесорів інтенсивних операцій.
Якщо ви використовуєте принаймні Java 8, ви можете використовувати метод runAsync
з класу CompletableFuture
CompletableFuture.runAsync(() -> {...});
Якщо вам потрібно повернути результат, скористайтеся supplyAsync
натомість
CompletableFuture.supplyAsync(() -> 1);