2. Чем Thread отличается от Runnable? Когда нужно использовать Thread, а когда Runnable?
UNKNOWNThread Класс
Более простой способ.
В этом случае можно наследоваться только от одного родительского класса Thread.
Свои конструкторы и методы.
class Thread implements Runnable
public class ThreadTest1 {
public static void main(String[] args) throws InterruptedException {
AnotherTask thread = new AnotherTask();
thread.start();
for (int i = 0; i < 3; i++) {
System.out.println(\"m\" + i);
Thread.sleep(1000);
}
thread.join();
System.out.println(\"End\");
}
}
class AnotherTask extends Thread {
@Override
public void run(){
for (int i = 0; i < 5; i++) {
System.out.println(\"r\" + i);
try {
Thread.sleep(1000);
}
catch (InterruptedException e) {
System.out.println(\"Interrupt\");
}
}
}
}
Runnable Интерфейс
Способ более гибкий
Можно имплементить много интерфейсов
Только метод run()
public class ThreadTest {
public static void main(String[] args) throws InterruptedException {
AnotherRun anotherRun = new AnotherRun();
Thread childTread = new Thread(anotherRun);
childTread.start();
for (int i = 0; i < 3; i++) {
System.out.println(\"m\" + i);
Thread.sleep(1000);
}
childTread.join();
System.out.println(\"End\");
}
}
class AnotherRun implements Runnable {
@Override
public void run() {
for (int i = 0; i < 5; i++) {
System.out.println(\"r\" + i);
try {
Thread.sleep(1000);
}
catch (InterruptedException e) {
System.out.println(\"Interrupt\");
}
}
}
}
Класс Thread
В классе Thread определены семь перегруженных конструкторов, большое количество методов, предназначенных для работы с потоками, и три константы (приоритеты выполнения потока).
Конструкторы класса Thread
Thread();
Thread(Runnable target);
Thread(Runnable target, String name);
Thread(String name);
Thread(ThreadGroup group, Runnable target);
Thread(ThreadGroup group, Runnable target, String name);
Thread(ThreadGroup group, String name);
где :
- target – экземпляр класса реализующего интерфейс Runnable;
- name – имя создаваемого потока;
- group – группа к которой относится поток.
Пример создания потока, который входит в группу, реализует интерфейс Runnable и имеет свое уникальное название :
Runnable r = new MyClassRunnable();
ThreadGroup tg = new ThreadGroup();
Thread t = new Thread(tg, r, \"myThread\");
Группы потоков удобно использовать, когда необходимо одинаково управлять несколькими потоками. Например, несколько потоков выводят данные на печать и необходимо прервать печать всех документов поставленных в очередь. В этом случае удобно применить команду ко всем потокам одновременно, а не к каждому потоку отдельно. Но это можно сделать, если потоки отнесены к одной группе.
Несмотря на то, что главный поток создаётся автоматически, им можно управлять.
Для этого необходимо создать объект класса Thread вызовом метода currentThread().
Методы класса Thread
Наиболее часто используемые методы класса Thread для управления потоками:
long getId() - получение идентификатора потока;
String getName() - получение имени потока;
int getPriority() - получение приоритета потока;
State getState() - определение состояния потока;
void interrupt() - прерывание выполнения потока;
boolean isAlive() - проверка, выполняется ли поток;
boolean isDaemon() - проверка, является ли поток «daemon»;
void join() - ожидание завершения потока;
void join(millis) - ожидание millis милисекунд завершения потока;
void notify() - «пробуждение» отдельного потока, ожидающего «сигнала»;
void notifyAll() - «пробуждение» всех потоков, ожидающих «сигнала»;
void run() - запуск потока,
void setDaemon(bool) - определение «daemon» потока;
void setPriority(int) - определение приоритета потока;
void sleep(int) - приостановка потока на заданное время;
void start() - запуск потока.
void wait() - приостановка потока, пока другой поток не вызовет метод notify();
void wait(millis) - приостановка потока на millis милисекунд или пока другой поток не
вызовет метод notify();
Жизненный цикл потока

- Новый− Новый поток начинает свой жизненный цикл в состоянии нового. Он сохраняетэто состояние до тех пор, пока программа не запустит поток. Его также называют созданным потоком.
- Запущенный − После запуска нового потока он становится запущенным. Считается, что поток в этом состоянии выполняет свою задачу.
- Ожидающий − Иногда поток переходит в состояние ожидания, т.е. поток ожидает, пока другой поток выполнит задачу. Поток переходит обратно в запущенное состояние только послетого, когда другой поток сигнализирует ожидающему потоку продолжить выполнение.
- Ожидающий с ограничением по времени − Запущенный поток может войти всостояние ожидания с ограничением по времени в течение определенного интервала времени. Поток в этом состоянии переходит обратно в запущенное состояние, когда истекает этот временной интервал или когда происходит событие, которого он ожидает.
- Остановленный− Запущенный поток переходит в остановленное состояние, когда он завершает свою задачу или иным образом завершается.
Предыдущий вопрос: 1. Чем процесс отличается от потока?
Следующий вопрос: 3. Что такое монитор? Как монитор реализован в java?
Все вопросы по теме: список
Все темы: список
Вопросы/замечания/предложения/нашли ошибку: напишите мне