ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 자바 인프런 - 스레드
    자바/인프런 인강 2018. 2. 16. 12:50

    자바는 멀티스레드를 지원한다.


    • 객체 1개당 스레드 1개


    1. Runnable 인터페이스를 implements해서 run()메소드 오버라이딩하기



    public class Threadtest implements Runnable{

    @Override

    public void run() {

    System.out.println(Thread.currentThread().getName());

    System.out.println("ThreadTest");

    for (int i = 0; i <10; i++) {

    System.out.println(i);

    try {

    Thread.sleep(500);

    } catch (Exception e) {

    }

    }

    }


    }


    -메인 메소드


    public class ThreadMain {

    public static void main(String[] args) {

    Threadtest threadtest = new Threadtest();

    Thread thread = new Thread(threadtest);

    thread.start();

    System.out.println(Thread.currentThread().getName());

    }


    }

    -실행 결과

    main

    Thread-0

    ThreadTest

    0

    1

    2

    3

    4

    5

    6

    7

    8

    9



    2. Thread 클래스를 상속 받아서 run() 메소드 오버라이딩하기


    public class Threadtest extends Thread{

    @Override

    public void run() {

    System.out.println(Thread.currentThread().getName());

    System.out.println("ThreadTest");

    for (int i = 0; i <10; i++) {

    System.out.println(i);

    try {

    Thread.sleep(500);

    } catch (Exception e) {

    }

    }

    }


    }


    -메인 메소드

    public class ThreadMain {
    public static void main(String[] args) {
    Threadtest threadtest = new Threadtest();
    threadtest.setName("A");
    threadtest.start();
    System.out.println(Thread.currentThread().getName());
    }

    }

    -실행 결과
    main
    A
    ThreadTest
    0
    1
    2
    3
    4
    5
    6
    7
    8
    9


    • 객체1개 당 스레드 n개

    아래 출력결과를 살펴보면 thread0과 thread1에서 testNum 객체 값을 공유한다.


    ※먼저 수행되는 스레드의 작업이 끝난 후 다른 스레드가 실행되게 하려면 Synchronized 키워드를 이용한다.


    public class Threadtest implements Runnable {

    int testNum = 0;


    @Override

    public void run() {


    for (int i = 0; i < 10; i++) {

    if (Thread.currentThread().getName().equals("A")) {

    System.out.println("======================");

    testNum++;

    }


    System.out.println("Thread Name:" + Thread.currentThread().getName() + "testNum:" + testNum);


    try {

    Thread.sleep(500);

    } catch (Exception e) {

    }


    }

    }


    }


    -메인 메소드

    public class ThreadMain {

    public static void main(String[] args) {

    Threadtest threadtest = new Threadtest();

    Thread thread0 = new Thread(threadtest, "A");

    Thread thread1 = new Thread(threadtest, "B");

    thread0.start();

    thread1.start();

    System.out.println(Thread.currentThread().getName());

    }


    }


    -실행 결과(출력 결과)

    main

    Thread Name:BtestNum:0            

    ======================

    Thread Name:AtestNum:1

    ======================

    Thread Name:BtestNum:1

    Thread Name:AtestNum:2

    ======================

    Thread Name:BtestNum:2

    Thread Name:AtestNum:3

    ======================

    Thread Name:AtestNum:4

    Thread Name:BtestNum:3

    ======================

    Thread Name:AtestNum:5

    Thread Name:BtestNum:4

    ======================

    Thread Name:AtestNum:6

    Thread Name:BtestNum:5

    ======================

    Thread Name:AtestNum:7

    Thread Name:BtestNum:6

    Thread Name:BtestNum:7

    ======================

    Thread Name:AtestNum:8

    ======================

    Thread Name:AtestNum:9

    Thread Name:BtestNum:8

    ======================

    Thread Name:AtestNum:10

    Thread Name:BtestNum:9



    • 객체 1개당 스레드 1개(객체와 스레드가 다수 일때)

    -메인 메소드(Thread 클래스는 위와 같음)


    public class ThreadMain {

    public static void main(String[] args) {

    Threadtest threadtest0 = new Threadtest();

    Threadtest threadtest1 = new Threadtest();

    Thread thread0 = new Thread(threadtest0, "A");

    Thread thread1 = new Thread(threadtest1, "B");

    thread0.start();

    thread1.start();

    System.out.println(Thread.currentThread().getName());

    }


    }


    -실행 결과(출력 결과)

    main

    ======================

    Thread Name:AtestNum:1

    Thread Name:BtestNum:0

    ======================

    Thread Name:AtestNum:2

    Thread Name:BtestNum:0

    ======================

    Thread Name:AtestNum:3

    Thread Name:BtestNum:0

    ======================

    Thread Name:AtestNum:4

    Thread Name:BtestNum:0

    ======================

    Thread Name:BtestNum:0

    Thread Name:AtestNum:5

    ======================

    Thread Name:AtestNum:6

    Thread Name:BtestNum:0

    ======================

    Thread Name:BtestNum:0

    Thread Name:AtestNum:7

    ======================

    Thread Name:AtestNum:8

    Thread Name:BtestNum:0

    ======================

    Thread Name:AtestNum:9

    Thread Name:BtestNum:0

    ======================

    Thread Name:AtestNum:10

    Thread Name:BtestNum:0


    >>Thread클래스의 if문에 의해서 A스레드의 testNum은 1씩 증가하고

    B스레드의 testNum은 계속 0으로 출력된다.




    • Synchronized는 1개의 객체에 n개의 스레드가 실행될때 먼저 실행된 스레드의 작업이 끝난 후 다음 스레드가 실행되게 한다.

    public class Threadtest implements Runnable {

    int testNum = 0;


    @Override

    public synchronized void  run() {


    for (int i = 0; i < 10; i++) {

    if (Thread.currentThread().getName().equals("A")) {

    System.out.println("======================");

    testNum++;

    }


    System.out.println("Thread Name:" + Thread.currentThread().getName() + "testNum:" + testNum);


    try {

    Thread.sleep(500);

    } catch (Exception e) {

    }


    }

    }


    }


    -메인 메소드

    public class ThreadMain {

    public static void main(String[] args) {

    Threadtest threadtest = new Threadtest();

    Thread thread0 = new Thread(threadtest, "A");

    Thread thread1 = new Thread(threadtest, "B");

    thread0.start();

    thread1.start();

    System.out.println(Thread.currentThread().getName());

    }


    }