java tutorial - Руководство Java Multithreading Programming - учебник java - java programming - учиться java - java basics - java for beginners
1- Принцип работы Thread

java - джава - учиться java - учебник java -
java multi поток proram
- примеры java - java-программы
2- Пример начала с Thread
- Нам нужны 2 класса, которые будут участвовать в данном примере.
- HelloMain это обычный класс с функцией main, являющийся главным потоком (main thread).
- HelloThread это расширенный класс из класса Thread. Создан и работает внутри главного потока и будет работать параллельно с главным потоком.

java - джава - учиться java - учебник java -
нить java
- примеры java - java-программы
package org.wikitechy.tutorial.thread.hellothread;
public class HelloMain {
public static void main(String[] args) throws InterruptedException {
int idx = 1;
for (int i = 0; i < 2; i++) {
System.out.println("Main thread running " + idx++);
// Sleep 2101 miliseconds.
Thread.sleep(2101);
}
HelloThread helloThread = new HelloThread();
// Run thread
helloThread.start();
for (int i = 0; i < 3; i++) {
System.out.println("Main thread running " + idx++);
// Sleep 2101 miliseconds.
Thread.sleep(2101);
}
System.out.println("==> Main thread stopped");
}
}
нажмите кнопку ниже, чтобы скопировать код. - от - java tutorials - командаHelloThread.java
- HelloMain это обычный класс с функцией main, являющийся главным потоком (main thread).
- HelloThread это расширенный класс из класса Thread. Создан и работает внутри главного потока и будет работать параллельно с главным потоком.
- Результат запуска класса HelloMain:

java - джава - учиться java - учебник java -
основной поток java
- примеры java - java-программы
3- Runnable Interface
- Вы так же можете создать thread из класса выполняющего интерфейсt Runnable. Смотрите иллюстрированный пример:
RunnableDemo.java
package org.wikitechy.tutorial.thread.runnable;
public class RunnableDemo implements Runnable {
@Override
public void run() {
int idx = 1;
for (int i = 0; i < 5; i++) {
System.out.println("Hello from RunnableDemo " + idx++);
// Sleep 2 second.
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
}
}
}
}
нажмите кнопку ниже, чтобы скопировать код. - от - java tutorials - командаRunnableTest.java
package org.wikitechy.tutorial.thread.runnable;
public class RunnableTest {
public static void main(String[] args) throws InterruptedException {
System.out.println("Main thread running..");
// Create a thread from Runnable.
Thread thread = new Thread(new RunnableDemo());
thread.start();
// Sleep 5 seconds.
Thread.sleep(5000);
System.out.println("Main thread stopped");
}
}
нажмите кнопку ниже, чтобы скопировать код. - от - java tutorials - командаЗапуск класса RunnableTest:

java - джава - учиться java - учебник java -
запуску теста
- примеры java - java-программы
4- Поток Deamon (Deamon Thread)
- Java делит thread на 2 вида: обычный и Deamon Thread. Они отличаются только тем, как останавливают работу. В одной программе обычные потоки и поток Deamon работают параллельно. Когда все обычные паотоки завершаются, потоки Deamon так же завершатся, несмотря на то, что они выполняют на тот момент.
Thread thread = new MyThread();
// marks this thread as a daemon thread
// This method is only called when the thread is not a start.
// In the case of start, it will be throws an exception.
thread.setDeamon(true);
// marks this thread as a none-daemon thread
// This method is only called when the thread is not a start.
// In the case of start, it will be throws an exception.
thread.setDeamon(false);
нажмите кнопку ниже, чтобы скопировать код. - от - java tutorials - команда- Чтобы лучше понять, рассмотрим следующий пример, нам нужны 3 класса для участя в иллюстрации:

java - джава - учиться java - учебник java -
Димон поток
- примеры java - java-программы
NoneDeamonThread.java
package org.wikitechy.tutorial.thread.deamon;
public class NoneDeamonThread extends Thread {
@Override
public void run() {
int i = 0;
// Loop 10 times. This thread will end.
while (i < 10) {
System.out.println(" - Hello from None Deamon Thread " + i++);
try {
// Sleep 1 second
Thread.sleep(1000);
} catch (InterruptedException e) {
}
}
// None deamon thread ending.
System.out.println("\n==> None Deamon Thread ending\n");
}
}
нажмите кнопку ниже, чтобы скопировать код. - от - java tutorials - командаDeamonThread.java
package org.wikitechy.tutorial.thread.deamon;
class DeamonThread extends Thread {
@Override
public void run() {
int count = 0;
// Infinite loop
while (true) {
System.out.println("+ Hello from Deamon Thread " + count++);
try {
// Sleep 2 second
sleep(2000);
} catch (InterruptedException e) {
}
}
}
}
нажмите кнопку ниже, чтобы скопировать код. - от - java tutorials - командаDaemonTest.java
package org.wikitechy.tutorial.thread.deamon;
public class DaemonTest {
public static void main(String[] args) {
System.out.println("==> Main Thread running..\n");
// Create thread
Thread deamonThread = new DeamonThread();
// Set deamon true
deamonThread.setDaemon(true);
deamonThread.start();
// Create other thread
new NoneDeamonThread().start();
try {
// Sleep 5 second
Thread.sleep(5000);
} catch (InterruptedException e) {
}
// Main Thread ending
System.out.println("\n==> Main Thread ending\n");
}
}
нажмите кнопку ниже, чтобы скопировать код. - от - java tutorials - команда- Результаты запуска класса DeamonTest:

java - джава - учиться java - учебник java -
Главный поток
- примеры java - java-программы
- Изображение выше показывает, что поток Deamon остановлен когда все обычные потоки остановлены. Несмотря на то, что его код работает бесконечно.
Для чего обычно используется поток deamon?
- Один из важных потоков Deamon в Java это поток Garbage Collection, то есть собрать ресурсы, которые больше не используются чтобы освободить память. Когда все потоки пользователя перестают работать, останавливается так же поток Garbage Collection.
5- Использование join() & join(long)
- Thread.join() это метод оповещающий подождать, когда завершится этот поток, только потом продолжает запускаться родительский поток.
// Parent thread must wait until the end of this thread, before being continued.
// (This is equivalent to calling join(0))
public final void join() throws InterruptedException;
// Parent thread must wait 'millis' milliseconds to continue running.
// After call join(long).
// If the parameter millis = 0 means to wait until the end of this thread.
public final synchronized void join(long millis) throws InterruptedException;
// Parent thread must wait 'millis' milliseconds and 'nanos' nanoseconds to continue running.
// After call join(long,int).
// 1 second = 1000000 nanoseconds.
public final synchronized void join(long millis, int nanos) throws InterruptedException;
нажмите кнопку ниже, чтобы скопировать код. - от - java tutorials - командаПосмотрим изображенный пример:

java - джава - учиться java - учебник java -
присоединиться-к потоку java
- примеры java - java-программы
JoinThread.java
package org.wikitechy.tutorial.thread.join;
public class JoinThread extends Thread {
private String threadName;
private int count;
public JoinThread(String threadName, int count) {
this.threadName = threadName;
this.count = count;
}
@Override
public void run() {
for (int i = 1; i < count + 1; i++) {
System.out.println("Hello from " + this.threadName + " " + i);
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
}
}
System.out.println("\n==> Thread " + threadName + " end!\n");
}
}
нажмите кнопку ниже, чтобы скопировать код. - от - java tutorials - командаJoinTest.java
package org.wikitechy.tutorial.thread.join;
public class JoinTest {
public static void main(String[] args) throws InterruptedException {
System.out.println("\n==> Main thread starting..\n");
Thread joinThreadA = new JoinThread("A*", 2);
Thread joinThreadB = new JoinThread("B*", 3);
// None join Thread.
Thread noJoinThreadC = new JoinThread("C", 5);
joinThreadA.start();
joinThreadB.start();
noJoinThreadC.start();
// Using join()
joinThreadA.join();
joinThreadB.join();
// The following code will have to wait until 2
// JoinThread A, B completed.
System.out.println("Hello from main thread...");
System.out.println("Thread A isLive? " + joinThreadA.isAlive());
System.out.println("Thread B isLive? " + joinThreadB.isAlive());
System.out.println("Thread C isLive? " + noJoinThreadC.isAlive());
System.out.println("\n==> Main Thread end!\n");
}
}
нажмите кнопку ниже, чтобы скопировать код. - от - java tutorials - командаРезультаты запуска класса JoinTest:

java - джава - учиться java - учебник java -
соединения испытания
- примеры java - java-программы
- Пример использования join(long millis):
JoinTest2.java
package org.wikitechy.tutorial.thread.join;
public class JoinTest2 {
public static void main(String[] args) throws InterruptedException {
System.out.println("\n==> Main thread starting..\n");
Thread joinThreadA = new JoinThread("A*", 5);
joinThreadA.start();
// Main thread must wait to 5000 miliseconds,
// and then continue running. (Not necessarily joinThreadA finish)
joinThreadA.join(5000);
System.out.println("Main thread after 5000 milli second");
System.out.println("Hello from main thread...");
System.out.println("Thread A isLive? " + joinThreadA.isAlive());
System.out.println("\n==> Main Thread end!\n");
}
}
нажмите кнопку ниже, чтобы скопировать код. - от - java tutorials - команда6- Обработки исключений для Thread
- Метод Thread.setDefaultUncaughtExceptionHandler() настроен обрабатывать по умолчанию, когда поток внезапно завершается из-за непойманного исключения, и не было другой обработки, которая была определена для того потока.
ThreadExceptionDemo.java
package org.wikitechy.tutorial.thread.exception;
import java.util.Random;
public class ThreadExceptionDemo {
public static class RunnableTest implements Runnable {
@Override
public void run() {
System.out.println("Thread running ..");
while (true) {
Random r = new Random();
// A random number from 0-99
int i = r.nextInt(100);
System.out.println("Next value " + i);
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
}
if (i > 70) {
// Simulate an exception was not handled in the thread.
throw new RuntimeException("Have a problem...");
}
}
}
}
public static void main(String[] args) {
System.out.println("==> Main thread running...");
Thread thread = new Thread(new RunnableTest());
Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread t, Throwable e) {
System.out.println("#Thread: " + t);
System.out.println("#Thread exception message: " + e.getMessage());
}
});
thread.start();
System.out.println("==> Main thread end...");
}
}
нажмите кнопку ниже, чтобы скопировать код. - от - java tutorials - командаРезультаты запуска примера:

java - джава - учиться java - учебник java -
исключение потока
- примеры java - java-программы
7- Использование yield()
- Теоритически, "yield" это значит отпустить, сдаться. Поток yield говорит виртуальной машине, что он готов, чтобы другие потоки расположились на его месте. Это значит он не делеает ничего важного. Заметьте, что это только подсказка, и не гарантирует быть эффективным везде.
- yield() определяется в Thread.java следующим образом
public static native void yield();
нажмите кнопку ниже, чтобы скопировать код. - от - java tutorials - команда