티스토리 뷰

반응형

스레드 우선순위(Thread Priority)

우리가 이미 알고 있듯이 Java는 스레드 스케줄러가 스레드의 우선 순위에 따라 스레드에 프로세서를 할당하는 멀티스레딩 환경 내에서 완전히 객체 지향적으로 작동합니다. Java에서 스레드를 생성할 때마다 항상 우선 순위가 할당됩니다. 우선순위는 스레드를 생성하는 동안 JVM에서 제공하거나 프로그래머가 명시적으로 제공할 수 있습니다.

스레드의 우선 순위는 각 스레드가 우선 순위를 갖는 개념으로, 조금 더 쉽게 설명 드린다면 모든 객체가 1에서 10 사이의 숫자로 표시되는 우선 순위를 갖는다고 말할 수 있습니다.

  • 기본 우선 순위는 예외로 5로 설정됩니다.
  • 최소 우선 순위는 1로 설정됩니다.
  • 최대 우선 순위는 10으로 설정됩니다.

위 설정과 관련된 값들은 Thread.class 에 아래와 같이 상수값이 정의 되어있습니다.

  • public static int NORM_PRIORITY
  • public static int MIN_PRIORITY
  • public static int MAX_PRIORITY
 💡 스레드에 대해 허용되는 우선 순위 값은 1에서 10 사이입니다.

 

 

Java에서 스레드의 우선 순위를 가져오고 설정하는 메서드는 아래와 같습니다.

  • public final int getPriority() : 주어진 스레드의 우선 순위를 반환합니다.
  • public final void setPriority(int newPriority) : 스레드의 우선 순위를 newPriority 값으로 변경합니다. 이 메소드는 newPriority 매개변수의 값이 minimum(1) 및 maximum(10) 제한을 초과하는 경우 IllegalArgumentException을 발생시킵니다.

 

우선 순위를 설정하는 예제

class PriorityThreadMain extends Thread {

    public void run() {
        System.out.println("Inside run method");
    }

    public static void main(String[] args) {
        PriorityThreadMain t1 = new PriorityThreadMain();
        PriorityThreadMain t2 = new PriorityThreadMain();
        PriorityThreadMain t3 = new PriorityThreadMain();

        // Thread 1 우선순위 5
        System.out.println("t1 thread priority : " + t1.getPriority());

        // Thread 2 우선순위 5
        System.out.println("t2 thread priority : " + t2.getPriority());

        // Thread 3 우선순위 5
        System.out.println("t3 thread priority : " + t3.getPriority());

        // Setting priorities of above threads by
        // passing integer arguments
        t1.setPriority(2);
        t2.setPriority(5);
        t3.setPriority(8);
        // t3.setPriority(21); 같이 1~10 사이로 지정하지 않게되면 throw IllegalArgumentException 발생된다

        // 2
        System.out.println("t1 thread priority : "+ t1.getPriority());

        // 5
        System.out.println("t2 thread priority : "+ t2.getPriority());

        // 8
        System.out.println("t3 thread priority : "+ t3.getPriority());

        // Main thread
        // 현재 실행중인 스레드 이름 반환
        System.out.println("Currently Executing Thread : "+ Thread.currentThread().getName());

        System.out.println("Main thread priority : "+ Thread.currentThread().getPriority());

        // 메인 스레드의 우선 순위를 10으로 세팅
        Thread.currentThread().setPriority(10);

        System.out.println("Main thread priority : "+ Thread.currentThread().getPriority());
    }
}
t1 thread priority : 5
t2 thread priority : 5
t3 thread priority : 5
t1 thread priority : 2
t2 thread priority : 5
t3 thread priority : 8
Currently Executing Thread : main
Main thread priority : 5
Main thread priority : 10
  • 우선 순위가 가장 높은 스레드가 다른 스레드보다 먼저 실행 기회를 얻습니다. 우선 순위가 4, 6 및 1인 3개의 스레드 t1, t2 및 t3이 있다고 가정합니다. 따라서 스레드 t2는 최대 우선 순위 6을 기반으로 먼저 실행되고 그 후 t1이 실행되고 그 다음 t3이 실행됩니다.
  • 기본 스레드의 기본 우선 순위는 항상 5이며 나중에 변경할 수 있습니다. 다른 모든 스레드의 기본 우선 순위는 상위 스레드의 우선 순위에 따라 다릅니다.

위 예제에서는 우선순위를 설정만 해주었는데요, 아래 예제에서 우선 순위를 세팅하고 실행하여 지정한 우선 순위가 동작이 되는지 확인해보겠습니다.

우선 순위를 설정하고 실제로 실행해본 예제

class Task1 extends Thread {
    @Override
    public void run() {
        System.out.println("\\nTask1 Start");
        for(int i = 101; i <= 199; i++) {
            System.out.print(i + " ");
        }
        System.out.println("\\nTask1 Finish");
    }
}

class Task2 implements Runnable {
    @Override
    public void run() {
        System.out.println("\\nTask2 Start");
        for(int i = 201; i <= 299; i++) {
            System.out.print(i + " ");
        }
        System.out.println("\\nTask2 Finish");
    }
}

public class Task2ThreadMain {
    public static void main(String[] args) {
        Task1 task1 = new Task1();
        task1.start();

        Task2 task2 = new Task2();
        Thread task2Thread = new Thread(task2);
        // task2 우선 순위를 가장 높게 설정
        task1.setPriority(Thread.MAX_PRIORITY);
        task2Thread.start();

        for(int i = 301; i <= 399; i++) {
            System.out.print(i + " ");
        }
        System.out.println("\\nTask3 Finish");
    }
}
Task1 Start
101 102 103 104 105 106 107 108 109 110 111 112 301 113 302 
Task2 Start
114 201 303 202 115 203 204 304 205 305 116 306 206 307 117 308 207 309 118 310 311 208 312 119 313 314 209 315 210 120 211 212 316 213 121 214 215 317 216 122 217 318 218 123 219 319 220 124 221 320 222 125 223 321 224 126 225 322 226 127 227 323 228 128 229 324 230 129 231 325 232 130 233 326 234 131 235 327 236 132 237 328 238 133 239 329 240 134 241 330 242 135 243 331 244 136 245 332 246 137 247 333 248 138 249 334 250 139 251 335 252 140 253 336 254 141 255 256 337 257 142 258 259 260 338 261 143 262 263 339 264 144 265 266 267 268 269 270 340 271 145 272 273 341 274 146 275 276 342 277 147 278 343 279 148 280 281 282 283 344 284 149 285 286 287 288 289 290 291 292 293 345 294 150 295 296 297 298 299 346 
Task2 Finish
151 347 152 348 153 349 154 155 156 157 350 158 351 159 352 160 353 161 354 162 355 163 356 164 357 165 358 166 359 167 360 168 361 169 362 170 363 171 364 172 365 173 366 174 367 175 368 176 369 177 370 371 178 372 179 373 180 181 182 183 184 185 374 186 187 188 189 190 191 192 193 194 195 196 197 198 199 375 376 377 378 379 380 381 382 383 
Task1 Finish
384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 
Task3 Finish

예제를 실행해보면 Task2가 Task1보다 먼저 수행이 종료되는 것을 확인 할 수 있습니다. 그러나 예제를 여러번 실행해본다면 Task1이나 Task3가 먼저 종료 될 때도 있는 것을 확인 할 수 있습니다. 여기서 주의해야 할 점은 우선 순위 설정은 단지 추천 순위 정도입니다. 우선 순위를 제일 높게 설정한다고 항상 먼저 실행됨을 보장 할 수는 없습니다.

 

 


반응형
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함