Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ «Ѐилософия Java3Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 117

Автор Π‘Ρ€ΡŽΡ ЭккСль

#4(5). #0(4)

#1(2). #2(2)

#1(Liftoff") */// _ #2(9). #3(9) #4(7). #0(6) #1(4). #2(4) #3(2). #4(2) #2(Liftoff!) #4(9). #0(8) #1(6). #2(6) #3(4). #4(4) #0(1). #1(1) #3(Liftoff!) #1(8). #2(8) #3(6). #4(6) #0(3). #1(3) #2(1). #3(1) #4(Liftoff!)

#3(8). #4(8). #0(7). #1(7).

#0(5). #1(5). #2(5). #3(5).

#2(3). #3(3). #4(3). #0(2).

#4(1). #0(Liftoff1).

Π’Ρ‹Π·ΠΎΠ² ΠΌΠ΅Ρ‚ΠΎΠ΄Π° sleep() ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡŽ InterruptedException; ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚ этого ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ продСмонстрирован Π² run(). ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π½Π΅ Ρ€Π°ΡΠΏΡ€ΠΎΡΡ‚Ρ€Π°Π½ΡΡŽΡ‚ΡΡ ΠΏΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ Π² main(), Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ локально ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π»ΡŽΠ±Ρ‹Π΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ, Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‰ΠΈΠ΅ Π²Π½ΡƒΡ‚Ρ€ΠΈ Π·Π°Π΄Π°Ρ‡ΠΈ.

Π’ Java SE5 появилась новая вСрсия sleep(), оформлСнная Π² Π²ΠΈΠ΄Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° класса Timellnit; ΠΎΠ½Π° продСмонстрирована Π² ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅. Она Π΄Π΅Π»Π°Π΅Ρ‚ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π±ΠΎΠ»Π΅Π΅ наглядной, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Π΅Π΄ΠΈΠ½ΠΈΡ†Ρ‹ измСрСния ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠΈ. Класс Timellnit Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для выполнСния ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠΉ, ΠΊΠ°ΠΊ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π΄Π°Π»Π΅Π΅ Π² этой Π³Π»Π°Π²Π΅.

На Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ°Ρ… Π·Π°Π΄Π°Ρ‡ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ Π² порядкС «идСального распрСдСлСния» β€” ΠΎΡ‚ 0 Π΄ΠΎ 4, Π·Π°Ρ‚Π΅ΠΌ снова ΠΎΡ‚ 4 Π΄ΠΎ 0. Π­Ρ‚ΠΎ Π²ΠΏΠΎΠ»Π½Π΅ Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ послС ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Π²Ρ‹Π²ΠΎΠ΄Π° Π·Π°Π΄Π°Ρ‡Π° ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ Π² состояниС оТидания, Ρ‡Ρ‚ΠΎ позволяСт ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊΡƒ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒΡΡ Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ Ρ‚Π°ΠΊΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ зависит ΠΎΡ‚ Π±Π°Π·ΠΎΠ²ΠΎΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²ΠΎΠ³ΠΎ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ°, поэтому ΠΏΠΎΠ»Π°Π³Π°Ρ‚ΡŒΡΡ Π½Π° Π½Π΅Π³ΠΎ нСльзя. Если Π²Π°ΠΌ потрСбуСтся ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ порядком выполнСния Π·Π°Π΄Π°Ρ‡, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ срСдства синхронизации (см. Π΄Π°Π»Π΅Π΅) ΠΈΠ»ΠΈ ΠΆΠ΅ Π²ΠΎΠΎΠ±Ρ‰Π΅ ΠΎΡ‚ΠΊΠ°ΠΆΠΈΡ‚Π΅ΡΡŒ ΠΎΡ‚ использования ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΈ Π½Π°ΠΏΠΈΡˆΠΈΡ‚Π΅ собствСнныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ синхронизации, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π΄Ρ€ΡƒΠ³ Π΄Ρ€ΡƒΠ³Ρƒ Π² Π½ΡƒΠΆΠ½ΠΎΠΌ порядкС.

ΠŸΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚

ΠŸΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ (priority) ΠΏΠΎΡ‚ΠΎΠΊΠ° сообщаСт ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊΡƒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎΠ± ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ваТности ΠΏΠΎΡ‚ΠΎΠΊΠ°. Π₯отя порядок обращСния процСссора ΠΊ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΌΡƒ Π½Π°Π±ΠΎΡ€Ρƒ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΈ Π½Π΅ Π΄Π΅Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Π½, Ссли сущСствуСт нСсколько приостановлСнных ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰ΠΈΡ… запуска, ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊ сначала запустит ΠΏΠΎΡ‚ΠΎΠΊ с большим ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠΌ. Π’ΠΏΡ€ΠΎΡ‡Π΅ΠΌ, это Π½Π΅ Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠΈ с младшими ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π°ΠΌΠΈ Π½Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ вовсС (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Ρ‚ΡƒΠΏΠΈΠΊΠΎΠ²Ρ‹Ρ… ситуаций ΠΈΠ·-Π·Π° ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠ² Π½Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚). ΠŸΠΎΡ‚ΠΎΠΊΠΈ с Π±ΠΎΠ»Π΅Π΅ Π½ΠΈΠ·ΠΊΠΈΠΌΠΈ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π°ΠΌΠΈ просто Π·Π°ΠΏΡƒΡΠΊΠ°ΡŽΡ‚ΡΡ Ρ‡ΡƒΡ‚ΡŒ Ρ€Π΅ΠΆΠ΅.

Π’ ΠΏΠΎΠ΄Π°Π²Π»ΡΡŽΡ‰Π΅ΠΌ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ случаСв всС ΠΏΠΎΡ‚ΠΎΠΊΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ со стандартным ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠΌ. Π›ΡŽΠ±Ρ‹Π΅ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠΈ манипуляций с ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π°ΠΌΠΈ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΡΠ²Π»ΡΡŽΡ‚ΡΡ ошибкой.

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ дСмонстрируСт использованиС ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠ². ΠŸΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° читаСтся ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ getPriority() ΠΈ задаСтся ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ setPriority():

//β€’ concurrency/Si mplePri ori ti es.java

// ИспользованиС ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠ² ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ².

import java.util.concurrent.*.

public class SimplePriorities implements Runnable { private int countDown = 5;

private volatile double d; // Π‘Π΅Π· ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½ΠΈΠ΅ &

private int priority; public SimplePriorities(int priority) { this.priority = priority;

}

public String toStringO {

return Thread.currentThreadО + "; " + countDown;

}

public void runО {

Thread.currentThreadO.setPriority(priority); while(true) {

// Высокозатратная, прСрываСмая опСрация; for(int 1=1: i < 100000; i++) {

d += (Math.PI + Math.E) / (double)i; ifCi % 1000 == 0)

Thread.yieldO;

}

System.out.printin(this); if(--countDown == 0) return;

}

}

public static void main(String[] args) {

ExecutorService exec = Executors.newCachedThreadPoolО; for(int i = 0; i < 5; i++) exec.execute(

new SimplePriorities(Thread.MIN_PRIORITY));

exec.execute(

new SimplePriorities(Thread.MAX_PRIORITY)); exec.shutdownO;

}

} /* Output:

Thread[pool-l-thread-6.10.main]: 5 ThreadEpool-l-thread-6.10.main]: 4 ThreadEpool-l-thread-6.10.main]: 3 ThreadEpool-l-thread-6.10.main]: 2 ThreadEpool-l-thread-6.10.main]: 1 ThreadEpool-l-thread-3.1.main]: 5 ThreadEpool-l-thread-2.1.main]: 5 ThreadEpool-1-thread-l.1.main]: 5 ThreadEpool-l-thread-5.1.main]: 5 ThreadEpool-l-thread-4.1.main]: 5

*///:-

Π’ этой вСрсии ΠΌΠ΅Ρ‚ΠΎΠ΄ toStringO пСрСопрСдСляСтся ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ Thread. toString(), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ имя ΠΏΠΎΡ‚ΠΎΠΊΠ° (Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π΄Π°Ρ‚ΡŒ Π² конструкторС, Π½ΠΎ здСсь ΠΈΠΌΠ΅Π½Π° автоматичСски Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π² Π²ΠΈΠ΄Π΅ pool-1-thread-l, pool-l-thread-2 ΠΈ Ρ‚. Π΄.), ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ ΠΈ Π³Ρ€ΡƒΠΏΠΏΡƒ, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ ΠΏΠΎΡ‚ΠΎΠΊ. ΠŸΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Π°Ρ вСрсия toString() Ρ‚Π°ΠΊΠΆΠ΅ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹ΠΉ отсчСт, выполняСмый Π·Π°Π΄Π°Ρ‡Π΅ΠΉ. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅: для получСния ссылки Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Thread, ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΠΈΠΉ Π·Π°Π΄Π°Ρ‡Π΅ΠΉ, Π²Π½ΡƒΡ‚Ρ€ΠΈ самой Π·Π°Π΄Π°Ρ‡ΠΈ, слСдуСт Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ Thread.currentThreadO.

ΠœΡ‹ Π²ΠΈΠ΄ΠΈΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ послСднСго ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΈΠΌΠ΅Π΅Ρ‚ Π½Π°ΠΈΠ²Ρ‹ΡΡˆΠΈΠΉ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ, Π° всС ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ находятся Π½Π° низшСм ΡƒΡ€ΠΎΠ²Π½Π΅. Π£Ρ‡Ρ‚ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ задаСтся Π² Π½Π°Ρ‡Π°Π»Π΅ выполнСния run(); Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π² конструкторС бСссмыслСнно, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Executor Π² этот ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π΅Ρ‰Π΅ Π½Π΅ Π½Π°Ρ‡Π°Π» Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Π·Π°Π΄Π°Ρ‡Ρƒ.

Π’ ΠΌΠ΅Ρ‚ΠΎΠ΄ run() Π±Ρ‹Π»ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Ρ‹ 100 ООО достаточно Π·Π°Ρ‚Ρ€Π°Ρ‚Π½Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ запятой, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ суммированиС ΠΈ Π΄Π΅Π»Π΅Π½ΠΈΠ΅ с числом Π΄Π²ΠΎΠΉΠ½ΠΎΠΉ точности double. ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ d Π±Ρ‹Π»Π° ΠΎΡ‚ΠΌΠ΅Ρ‡Π΅Π½Π° ΠΊΠ°ΠΊ volatile, Ρ‡Ρ‚ΠΎΠ±Ρ‹ компилятор Π½Π΅ примСнял ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡŽ. Π‘Π΅Π· этих вычислСний Π²Ρ‹ Π½Π΅ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅ эффСкта установки Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠ² (ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅ Π·Π°ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ†ΠΈΠΊΠ» for с вычислСниями). Π’ процСссС вычислСний ΠΌΡ‹ Π²ΠΈΠ΄ΠΈΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊ удСляСт большС внимания ΠΏΠΎΡ‚ΠΎΠΊΡƒ с ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠΌ MAX_PRI0RITY (ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅, Ρ‚Π°ΠΊΠΎΠ²ΠΎ Π±Ρ‹Π»ΠΎ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π° машинС ΠΏΠΎΠ΄ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ Windows Π₯Π ). НСсмотря Π΄Π°ΠΆΠ΅ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π²Ρ‹Π²ΠΎΠ΄ Π½Π° консоль Ρ‚Π°ΠΊΠΆΠ΅ являСтся «дорогостоящСй» ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠ΅ΠΉ, с Π½ΠΈΠΌ Π²Ρ‹ Π½Π΅ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅ влияниС ΡƒΡ€ΠΎΠ²Π½Π΅ΠΉ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠ², ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π²Ρ‹Π²ΠΎΠ΄ Π½Π° консоль Π½Π΅ прСрываСтся (ΠΈΠ½Π°Ρ‡Π΅ экран Π±Ρ‹Π» Π±Ρ‹ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ нСсуразицСй), Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ матСматичСскиС вычислСния, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Π΅ Π²Ρ‹ΡˆΠ΅, ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Ρ‚ΡŒ допустимо. ВычислСния Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ достаточно Π΄ΠΎΠ»Π³ΠΎ, соотвСтствСнно, ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ планирования ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π²ΠΌΠ΅ΡˆΠΈΠ²Π°Π΅Ρ‚ΡΡ Π² процСсс ΠΈ Ρ‡Π΅Ρ€Π΅Π΄ΡƒΠ΅Ρ‚ ΠΏΠΎΡ‚ΠΎΠΊΠΈ, проявляя ΠΏΡ€ΠΈ этом Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ ΠΊ Π±ΠΎΠ»Π΅Π΅ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π½Ρ‹ΠΌ. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ для обСспСчСния ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ контСкста Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ пСриодичСски Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ yield().

Π’ ΠΏΠ°ΠΊΠ΅Ρ‚Π΅ JDK прСдусмотрСно 10 ΡƒΡ€ΠΎΠ²Π½Π΅ΠΉ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠ², ΠΎΠ΄Π½Π°ΠΊΠΎ это Π½Π΅ слишком Ρ…ΠΎΡ€ΠΎΡˆΠΎ согласуСтся с Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎΠΌ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ… систСм. К ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ, Π² Windows имССтся 7 классов ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠ², Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΈΡ… ΡΠΎΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ Π½Π΅ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ (хотя Π² ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмС Sun Solaris имССтся 231 ΡƒΡ€ΠΎΠ²Π½Π΅ΠΉ). ΠŸΠ΅Ρ€Π΅Π½ΠΎΡΠΈΠΌΠΎΡΡ‚ΡŒ обСспСчиваСтся Ρ‚ΠΎΠ»Ρ…^ΠΎ использованиСм ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Ρ‹Ρ… констант МАΠ₯_Π RIORITY, NORM.PRIORITY ΠΈ MIN_PRI0RITY.

ΠŸΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° управлСния

Если Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅, Ρ‡Ρ‚ΠΎ Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ run() сдСлано всС Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠ΅, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠ΄ΡΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΡƒ планирования ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², Ρ‡Ρ‚ΠΎ процСссором Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ. Π­Ρ‚Π° подсказка (Π½Π΅ Π±ΠΎΠ»Π΅Π΅ Ρ‡Π΅ΠΌ рСкомСндация; Π½Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΠΈ, Ρ‡Ρ‚ΠΎ ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Β«ΠΏΡ€ΠΈΡΠ»ΡƒΡˆΠ°Π΅Ρ‚ΡΡΒ» ΠΊ Π½Π΅ΠΉ) воплощаСтся Π² Ρ„ΠΎΡ€ΠΌΠ΅ Π²Ρ‹Π·ΠΎΠ²Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Π° yield(). Вызывая yield(), Π²Ρ‹ сообщаСтС систСмС, Ρ‡Ρ‚ΠΎ Π² Π½Π΅ΠΉ ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π°.

Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ LiftOff ΠΌΠ΅Ρ‚ΠΎΠ΄ yield() обСспСчиваСт Ρ€Π°Π²Π½ΠΎΠΌΠ΅Ρ€Π½ΠΎΠ΅ распрСдСлСниС Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… рСсурсов ΠΌΠ΅ΠΆΠ΄Ρƒ Π·Π°Π΄Π°Ρ‡Π°ΠΌΠΈ LiftOff. ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅ Π·Π°ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π²Ρ‹Π·ΠΎΠ² Thread.yield() Π² Lift0ff.run() ΠΈ прослСдитС Π·Π° различиями. И всС ΠΆΠ΅, Π² ΠΎΠ±Ρ‰Π΅ΠΌ случаС Π½Π΅ стоит ΠΏΠΎΠ»Π°Π³Π°Ρ‚ΡŒΡΡ Π½Π° yield() ΠΊΠ°ΠΊ Π½Π° ΡΠ΅Ρ€ΡŒΠ΅Π·Π½ΠΎΠ΅ срСдство настройки вашСго прилоТСния.

ΠŸΠΎΡ‚ΠΎΠΊΠΈ-Π΄Π΅ΠΌΠΎΠ½Ρ‹

Π”Π΅ΠΌΠΎΠ½ΠΎΠΌ называСтся ΠΏΠΎΡ‚ΠΎΠΊ, ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠΉ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ сСрвис, работая Π² Ρ„ΠΎΠ½ΠΎΠ²ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅ Π²ΠΎ врСмя выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Π½ΠΎ ΠΏΡ€ΠΈ этом Π½Π΅ являСтся Π΅Π΅ Π½Π΅ΠΎΡ‚ΡŠΠ΅ΠΌΠ»Π΅ΠΌΠΎΠΉ Ρ‡Π°ΡΡ‚ΡŒΡŽ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΊΠΎΠ³Π΄Π° всС ΠΏΠΎΡ‚ΠΎΠΊΠΈ Π½Π΅-Π΄Π΅ΠΌΠΎΠ½Ρ‹ Π·Π°ΠΊΠ°Π½Ρ‡ΠΈΠ²Π°ΡŽΡ‚ свою Π΄Π΅ΡΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ. И Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚, Ссли ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ Π½Π΅-Π΄Π΅ΠΌΠΎΠ½Ρ‹, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅. БущСствуСт, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΠΎΡ‚ΠΎΠΊ Π½Π΅-Π΄Π΅ΠΌΠΎΠ½, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΠΈΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ main().

//: concurrency/SimpleDaemons.java

// ΠŸΠΎΡ‚ΠΎΠΊΠΈ-Π΄Π΅ΠΌΠΎΠ½Ρ‹ Π½Π΅ ΠΏΡ€Π΅ΠΏΡΡ‚ΡΡ‚Π²ΡƒΡŽΡ‚ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡŽ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹

import java.util.concurrent.*.

import static net mindview.util.Print.*;

public class SimpleDaemons implements Runnable { public void run() { try {

while(true) {

TimeUni t.MILLISECONDS.sieep(100). print(Thread.currentThread() + " H + this);

}

} catch(InterruptedException e) {

printC'sleepO interrupted").

}

}

public static void main(String[] args) throws Exception { for(int i = 0. i < 10; i++) {

Thread daemon = new Thread(new SimpleDaemonsO).

daemon setDaemon(true); // НСобходимо Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄ startO

daemon. startO;

}

printCBce Π΄Π΅ΠΌΠΎΠ½Ρ‹ Π·Π°ΠΏΡƒΡ‰Π΅Π½Ρ‹"). TimeUnit.MILLISECONDS sleep(175);

}

} /* Output: ВсС Π΄Π΅ΠΌΠΎΠ½Ρ‹ Π·Π°ΠΏΡƒΡ‰Π΅Π½Ρ‹

Thread[Thread-0.5.main] [email protected] Thread[Thread-1.5.main] [email protected] Thread[Thread-2.5.main] [email protected] Thread[Thread-3,5,main] [email protected] Thread[Thread-4.5.main] [email protected] Thread[Thread-5.5.main] [email protected] Thread[Thread-6.5.main] [email protected] Thread[Thread-7.5.main] [email protected] Thread[Thread-8.5.main] [email protected] Thread[Thread-9.5.main] [email protected]

*///:-

Π§Ρ‚ΠΎΠ±Ρ‹ Π½Π°Π·Π½Π°Ρ‡ΠΈΡ‚ΡŒ ΠΏΠΎΡ‚ΠΎΠΊ Π΄Π΅ΠΌΠΎΠ½ΠΎΠΌ, слСдуСт ΠΏΠ΅Ρ€Π΅Π΄ Π΅Π³ΠΎ запуском Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ setDaemon().

ПослС Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ main() Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ свою Ρ€Π°Π±ΠΎΡ‚Ρƒ, Π½ΠΈΡ‡Ρ‚ΠΎ Π½Π΅ прСпятствуСт Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π² процСссС Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ, ΠΊΡ€ΠΎΠΌΠ΅ Π΄Π΅ΠΌΠΎΠ½ΠΎΠ². Π§Ρ‚ΠΎΠ±Ρ‹ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ запуска всСх ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²-Π΄Π΅ΠΌΠΎΠ½ΠΎΠ² Π±Ρ‹Π»ΠΈ Π±ΠΎΠ»Π΅Π΅ наглядными, ΠΏΠΎΡ‚ΠΎΠΊ main() Π½Π° Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ врСмя погруТаСтся Π² «сон». Π‘Π΅Π· этого Π²Ρ‹ ΡƒΠ²ΠΈΠ΄Π΅Π»ΠΈ Π±Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Π°ΡΡ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² ΠΏΡ€ΠΈ создании Π΄Π΅ΠΌΠΎΠ½ΠΎΠ². (ΠŸΠΎΡΠΊΡΠΏΠ΅Ρ€ΠΈΠΌΠ΅Π½Ρ‚ΠΈΡ€ΡƒΠΉΡ‚Π΅ с Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ sleep() для ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»ΠΎΠ² Ρ€Π°Π·Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ.)

Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ SimpleDaemons.java ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ явноС созданиС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Thread для установки ΠΈΡ… «дСмонского» Ρ„Π»Π°Π³Π°. Π’Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ (Π΄Π΅ΠΌΠΎΠ½, ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚, имя) ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², созданных исполнитСлСм; для этого слСдуСт Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΡƒΡŽ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ ThreadFactory:

//: net/mi ndvi ew/uti1/DaemonThreadFactory.java package net.mindview.util;

import java util.concurrent.*;

public class DaemonThreadFactory implements ThreadFactory { public Thread newThread(Runnable r) { Thread t = new Thread(r), t.setDaemon(true); return t,

}

} /// -

ЕдинствСнноС ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ThreadFactory Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π² Π΄Π°Π½Π½ΠΎΠΌ случаС Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ Π΄Π΅ΠΌΠΎΠ½Π° задаСтся Ρ€Π°Π²Π½Ρ‹ΠΌ true. Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ DaemonThreadFactory пСрСдаСтся Π² Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π΅ Executors.newCachedThread-Pool():