Говоря языком непрофессионала, что такое «запускаемое» в Java? Я изучаю AP-программирование в старшей школе, и мне поручено проводить исследования или выяснять у других, что такое «работоспособный» (мы только входим в ООП и еще не касались потоков).
Говоря языком непрофессионала, что такое «запускаемое» в Java? Я изучаю AP-программирование в старшей школе, и мне поручено проводить исследования или выяснять у других, что такое «работоспособный» (мы только входим в ООП и еще не касались потоков).
Ответы:
Runnable - это, по сути, тип класса (Runnable - это интерфейс), который можно поместить в поток, описывая, что этот поток должен делать.
Runnable интерфейс требует от класса реализовать метод run()
следующим образом:
public class MyRunnableTask implements Runnable {
public void run() {
// do stuff here
}
}
А затем используйте это так:
Thread t = new Thread(new MyRunnableTask());
t.start();
Если бы у вас не было Runnable
интерфейса, класс Thread, который отвечает за выполнение ваших материалов в другом потоке, не имел бы обещания найти run()
метод в вашем классе, поэтому вы могли бы получить ошибки. Вот почему вам необходимо реализовать интерфейс.
Обратите внимание, что вам не нужно определять класс как обычно, вы можете сделать все это встроенным:
Thread t = new Thread(new Runnable() {
public void run() {
// stuff here
}
});
t.start();
Это похоже на предыдущее, только вы не создаете другой именованный класс.
run
метода, затем поток закрывается. Если вы хотите, чтобы поток запускался снова и снова, поместите цикл внутри run
метода.
new Thread(() -> System.out.println("hello from other thread")).start();
Runnable
это интерфейс, определенный так:
interface Runnable {
public void run();
}
Чтобы создать класс, который его использует, просто определите класс как (public) class MyRunnable implements Runnable {
Его можно использовать даже без создания нового потока. По сути, это ваш базовый интерфейс с одним вызываемым методом run.
Если вы создадите новый поток с параметром runnable, он вызовет метод run в новом потоке.
Также следует отметить, что потоки реализуются Runnable
, и это вызывается при создании нового потока (в новом потоке). Реализация по умолчанию просто вызывает любой Runnable, который вы передали в конструктор, поэтому вы можете просто обойтись new Thread(someRunnable)
без переопределения run
метода Thread .
Thread
пул потоков, это сложно, и если вы не реализуете пул потоков, вы постоянно несете значительные затраты на создание новых потоков. Напротив, простая реализация Runnable
означает, что вы можете легко использовать такие вещи, как ThreadPoolExecutorService
пул сторонних потоков.