Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Запустить новый поток можно двумя способами:
Насколько я понимаю возвращение результата работы потока используется не слишком часто
честно говоря я не очень понимаю зачем другим методам в стеке знать о возникнувшем исключении,
Допустим вы в рамках одного потока поймали InterruptedException, например, в методе sleep и поглотили его без выставления флага. Если дальше по коду (или выше по стеку) стоят проверки флага Interrupted — то они не сработают
class SomeThing //Нечто, реализующее интерфейс Runnable
implements Runnable //(содержащее метод run())volatile расскажу в следующей статье.volatile, сказав, что про это слово будет следующая статья.Основная моя проблема и моих коллег по работе, в том, что имея более пяти лет опыта разработки на java никто из нас ни разу не использовал многопоточность.
Для меня до сих пор не вполне ясно, какие проблемы и как я могу решить используя multi-threading
Хотелось бы простого объяснения вида: проблема -> решение +объяснение подводных камней, а не только описания всех классов пакета, с тоннами кода.
/**
* Causes the currently executing thread to sleep (cease execution)
* for the specified number of milliseconds plus the specified number
* of nanoseconds, subject to the precision and accuracy of system
* timers and schedulers. The thread does not lose ownership of any
* monitors.
*
* @param millis the length of time to sleep in milliseconds.
* @param nanos 0-999999 additional nanoseconds to sleep.
* @exception IllegalArgumentException if the value of millis is
* negative or the value of nanos is not in the range
* 0-999999.
* @exception InterruptedException if any thread has interrupted
* the current thread. The <i>interrupted status</i> of the
* current thread is cleared when this exception is thrown.
* @see Object#notify()
*/
public static void sleep(long millis, int nanos)
throws InterruptedException {
if (millis < 0) {
throw new IllegalArgumentException("timeout value is negative");
}
if (nanos < 0 || nanos > 999999) {
throw new IllegalArgumentException(
"nanosecond timeout value out of range");
}
if (nanos >= 500000 || (nanos != 0 && millis == 0)) {
millis++;
}
sleep(millis);
}
public void loop()
{
for (;;)
{
scan();
synchronized(lock)
{
lock.wait(60, TimeUnit.SECONDS);
}
}
}
public void forceScan()
{
synchronized(lock)
{
lock.notify();
}
}
Те «высокоуровневые примитивы» построены обычно как обёртки над низкоуровневыми,
т.е. быстрее быть не могут по определению.
Потому иногда имеет смысл написать свой велосипед, не такой универсальный как стандартный, а заточенный под конкретную задачу.
«высокоуровневые примитивы» построены обычно как обёртки над низкоуровневыми
если дойдут руки попробую даже как-то сравнить количественно разность в скорости работы для типовой задачи.
Если уж сравнивать, то с классом, предоставляющим аналогичные возможности, там Condition, например.
AtomicInteger — это вообще из другой оперы… там и не надо wait/notify
… ну ладно по быстрому: notify() — ничего не сказано, для sleep() — это тоже самое что для минуса плюс. Кстати и про yield() забыли.
Для пущего укорочения кода
public class Program //Класс с методом main().
{
public static void main(String[] args)
{
//Создание и Запуск потока
new Thread(new Runnable()
{
public void run() //Этот метод будет выполняться в побочном потоке
{
System.out.println("Привет из побочного потока!");
}
}).start();
System.out.println("Главный поток завершён...");
}
}
Многопоточность в Java