Что такое потоки Java

Что такое потоки JavaНачнем с рассмотрения программы, которая не использует средств многопоточности, и, как следствие, затрудняет пользователю выполнение нескольких задач сразу. После того, как мы проанализируем ее, мы покажем, как легко заставить эту программу запускать отдельные потоки. Эта программа будет анимировать прыгающий мячm постоянно перемещая его по экрану и меняя направление движения, когда он встретит преграду в виде стены.

Как только вы щелкнете на кнопке Start(Пуск), программа выбросит мяч из правого левого угла и он начнет прыгать. Обработчик события кнопки Start вызывает метод addBall. Этот метод содержит цикл из 1000 движений. Каждый вызов move() перемещает мяч на небольшое расстояние, изменяет направление движения, если он отскакивает от стены, и затем перерисовывает панель.

Статический метод sleep() класса Thread реализует задержку на заданное количество миллисекунд.

Вызов Thread.sleep() не создает нового потока, этот статический метод класса Thread временно приостанавливает действие текущего потока.

Компания copy.spb.ru печатает на холсте изображения любых форматов, от карманных до настенных. Вот услуги компании http://copy.spb.ru/nahi_uslugi/. Все по самым выгодным ценам на рынке.

Метод sleep() может сгенерировать исключение InterruptedException.

Если вы запустите эту программу, то мяч будет прыгать почти замечательно, однако при этом он полностью захватит управление программой. Если вам надоест наблюдать движение мяча до того, как он выполнит 1000 движений, и вы щелкнете на кнопке Close(Закрыть), мяч все равно продолжит играть. Вы не можете взаимодействовать с программой до тех пор, пока мяч не завершит свои прыжки.

Если вы внимательно присмотритесь к коду, приведенному в конце этой статьи, то заметите вызов comp.paint(comp.getGraphics()) внутри метода addBall класса BounceFrame. Это довольно странно — ведь обычно вы вызываете repaint() и позволяете AWT позаботиться о получении графического контекста и выполнении рисования. Но если вы попытаетесь вызвать comp.repaint() в этой программе, панель никогда не будет перерисована, потому что метод addBall() полностью захватил управление. Также обратите внимание на то, что компонент расширяет класс JPanel; это облегчает очистку фона.

Очевидно, что поведение этой программы никуда не годится. Оно совершенно подходит для программ, выполняющих более или менее длительную работу. В конце концов, когда вы читаете данные по сетевому соединению, часто случается иметь дело с задачами, которые вы действительно хотели бы прервать. Например, предположим, что вы загружаете огромное графическое изображение и, увидев его часть, решаете, что вам не нужно видеть остальное, конечно же, неплохо иметь возможность щелчком на кнопке Stop(Остановить) или Back(Назад) прервать процесс загрузки.