멀티스레드 ( Multi Thread )
Multi Tasking(멀티태스킹) 이란 두 가지 작업을 동시에 처리하는 것을 뜻합니다.
한 프로그램 안에서 멀티 태스킹을 동시에 하는 애플리케이션들도 있습니다.
스레드는 프로그램의 실행흐름입니다.
▶ 프로그램 내에 스레드가 2개라면 두 개의 코드 흐름이 생김을 뜻한다.
스레드의 사용 방법
방법 1.
(1). Runnable Interface를 상속받아 run() 추상메서드를 재정의
(2). Thread 객체의 생성자의 매개값으로 전달
(3). 그 다음 start() 메서드를 통해 실행
방법 2.
(1). Thread 클래스를 상속받아 run() 추상메서드를 재정의
(2). Thread 객체의 생성자의 매개값으로 전달합니다.
(3). 그 다음 start() 메서드를 통해 실행시킵니다.
두 방법의 차이
- Runnable은 인터페이스 이므로, 스레드 실행의 기능만 정의되어 있으므로 클래스내부에서
사용할 수 있는 메서드가 한정적입니다.
- Thread 클래스의 기능을 전부 받아서 사용할 수 있습니다.
스레드 기본 메서드
start() : 스레드 클래스를 실행
(static) currentThread() : 현재 스레드를 반환
getName() : 스레드 이름 반환
(static) sleep() : 스레드를 잠시 멈춤
yield() : 스레드 실행을 다른 스레드에게 양보
join() : 해당 스레드를 우선 실행
package api.thread.runable;
public class MainClass {
public static void main(String[] args) {
//메인도 하나의 쓰레드로 동작을 합니다.
//쓰레드를 동작시키려면 Thread객체를 생성합니다.
//객체 2개, 쓰레드 2개 (각각 실행됨)
ThreadTest t = new ThreadTest();
ThreadTest t2 = new ThreadTest();
Thread thread = new Thread(t, "A");
thread.start();
Thread thread2 = new Thread(t2, "B");
thread2.start();
System.out.println("main쓰레드 종료");
}
}
package api.thread.runable;
public class MainClass2 {
public static void main(String[] args) {
//객체 1개, 쓰레드는 2개 생성
ThreadTest t = new ThreadTest();
Thread thread = new Thread(t, "A");
Thread thread2 = new Thread(t, "B");
thread.start();
thread2.start();
System.out.println("main쓰레드 종료");
}
}
package api.thread.runable;
public class ThreadTest implements Runnable {
int num;
@Override
public void run() {
for(int i = 1; i <= 10; i++) {
Thread t = Thread.currentThread(); //현재동작되는 쓰레드 반환
if( t.getName().equals("A") ) { //현재 쓰레드의 이름을 받아옴
num++; //A쓰레드인 경우 num를 올린다
}
System.out.println("쓰레드이름:" + t.getName() + ", 합계:" + num);
//쓰레드 일시정지
try {
Thread.sleep(1000); //1초 일시정지
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
package api.thread.sync;
public class MainClass {
public static void main(String[] args) {
//동기화 - 한번에 하나의 작업
//비동기화 - 한번에 여러개의 작업을 동시에 진행함
ThreadTest t = new ThreadTest();
Thread thread1 = new Thread(t, "A");
Thread thread2 = new Thread(t, "B");
thread1.start();
thread2.start();
System.out.println("main스레드 종료");
}
}
package api.thread.sync;
public class ThreadTest implements Runnable {
int num;
@Override
public synchronized void run() {
for(int i = 1; i <= 10; i++) {
Thread t = Thread.currentThread(); //현재동작되는 쓰레드 반환
if( t.getName().equals("A") ) { //현재 쓰레드의 이름을 받아옴
num++; //A쓰레드인 경우 num를 올린다
}
System.out.println("쓰레드이름:" + t.getName() + ", 합계:" + num);
//쓰레드 일시정지
try {
Thread.sleep(1000); //1초 일시정지
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
동기화 메소드 synchronized
package api.thread.thread;
public class MainClass {
public static void main(String[] args) {
//Thread객체를 상속 받앗으므로
ThreadTest t = new ThreadTest();
t.setName("A"); //쓰레드 이름 지정
t.start();
System.out.println("main스레드 종료");
}
}
package api.thread.thread;
//Thread클래스 상속
public class ThreadTest extends Thread {
int sum;
@Override
public void run() {
for(int i = 1; i <= 10; i++) {
if(getName().equals("A") ) {
sum++;
}
System.out.println("쓰레드이름:" + getName() + ", 합계:" + sum);
try {
sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
728x90
'Programming > Java' 카테고리의 다른 글
[JAVA] 자바 Network (0) | 2024.02.26 |
---|---|
[JAVA] 정규표현식 (0) | 2024.02.26 |
[ JAVA ] 익명 객체와 람다식 (0) | 2024.02.26 |
[JAVA] API - java.util 패키지 (Collection FrameWork) (0) | 2023.12.07 |
[JAVA] API-IO (Input 스트림과 Output 스트림) (1) | 2023.12.06 |