자바/인프런 인강

자바 인프런 - 스레드

Gamcho 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());

}


}