-
자바 인프런 - 스레드자바/인프런 인강 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());}}-실행 결과mainAThreadTest0123456789- 객체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());
}
}
'자바 > 인프런 인강' 카테고리의 다른 글
자바 인프런 - 웹프로그래밍이란 (0) 2018.02.17 자바 인프런 - 간단한 채팅프로그램 (0) 2018.02.16 자바 인프런 - 입출력 API (0) 2018.02.15 자바 인프런 - Collections(자료구조) (0) 2018.02.14 자바 인프런 - 예외처리 (0) 2018.02.14