< 멀티스레드 >
- 하나의 프로세스가 두 가지 이상의 작업을 처리하는 것
- 스레드란 ? 프로세스 내부에서 코드의 실행 흐름을 말함
- 하나의 프로그램 안에 여러 개의 스레드를 둘 수 있음
- 메인 메서드도 하나의 스레드로 취급
- 하나의 스레드가 예외를 발생시키면 프로세스 자체가 종료될 수 있어 다른 스레드에 영향을 미침
① 멀티 프로세스와 멀티 스레드 차이
- 멀티 프로세스
· 자신의 메모리를 가지고 실행하므로 서로 독립적
· ex) 엑셀과 한글 프로그램을 동시에 사용하는 것
- 멀티 스레드
· 하나의 프로세스 내부에 생성되므로 서로 독립적이지 않음
· ex) 메신저 프로그램 안에서 채팅기능과 동시에 파일 전송 기능 수행
② 스레드를 만드는 방법
- Runnable(인터페이스)로 만듦
· void run() 메서드 가짐
public interface Runnable{
public void run();
}
class MyRunnable implements Runnable {
@Override
public void run(){ ... }
}
public static void main(String[] args) {
// 독립된 클래스로 Runnable 구현
Thread t1 = new Thread(new MyRunnable());
t1.start();
// 익명의 클래스로 Runnable 구현
Thread t2 = new Thread(new Runnable(){
@Override
public void run(){ ... }
});
t2.start();
// 람다로 Runnable 구현
Thread t3 = new Thread(()->{ ... }
);
t3.start();
}
· thread명 . start(); 로 스레드 시작시켜줌
- 상속받아서 만듦
class MyThread extends Thread {
@Override
public void run(){
...
}
}
② 구구단 스레드 만들기
- 인터페이스와 상속 받아서 구현해보겠음
public class ThreadEx2 {
public static void main(String[] args) {
System.out.println("메인 시작");
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
for(int i=1; i<=9;i++) {
System.out.println("2*"+i+" = " +(2*i));
}
}
});
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
for(int i=1; i<=9; i++) {
System.out.println("3*"+i+" = " +(3*i));
}
}
});
Dan4Thread t3 = new Dan4Thread();
t1.start();
t2.start();
t3.start();
System.out.println("메인 종료");
}
}
class Dan4Thread extends Thread {
@Override
public void run() {
for(int i=1; i<=9; i++)
System.out.println("4*"+i+" = " +(4*i));
}
}
- 실행될때마다 순서가 랜덤인걸 알 수 있음
- 메인 메서드가 먼저 종료가 되고 스레드들이 제각각 실행됨
- t2를 람다로 바꿔 표현한다면 ?
Thread t2 = new Thread(()->{
for(int i=1; i<=9; i++) {
System.out.println("3*"+i+" = " +(3*i));
}
});
t2.start();
※ 스레드명.start() 와 스레드명.run() 차이
- .start(); 는 랜덤 순서로 결과 보여줌 → 스레드로서 실행
- .run(); 은 코드 순서로 결과 보여줌 → 메소드로서 실행
③ 스레드 이름
- setName() 메소드로 스레드 이름 변경가능
thread.setName("스레드 이름");
- getName() 메소드로 스레드 이름 확인가능
thread.getName();
- 스레드 이름 지정하지 않으면 자동적으로 'Thread-n' 으로 지정
④ 구구단 게임 !
- 구구단을 외자 ! 구구단을 외자 !
- 카운트다운이 스레드로 작성되지 않았으면 10초 다 세고 게임 시작함
- 카운트다운이 스레드로 작성하면 10초 세기랑 게임창 동시에 뜸
public class GameEx1 {
public static void main(String[] args) {
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
for(int i=10; i>0;i--) {
try {
Thread.sleep(1000);
}catch (InterruptedException e) {}
System.out.println("count down : "+i );
}
}
});
t1.start();
int num1 = (int)(Math.random()*9)+1; // 1~9
int num2 = (int)(Math.random()*9)+1; // 1~9
String msg = num1 + "*"+num2+" = ? ";
String result = JOptionPane.showInputDialog(msg);
System.out.println(result);
if((num1*num2)==Integer.parseInt(result)) {
System.out.println("빙고");
}else {
System.out.println("틀림");
}
}
}
'자바 웹 개발자가 될거야 > JAVA' 카테고리의 다른 글
[JAVA] 데몬스레드 (0) | 2021.12.09 |
---|---|
[JAVA] 동기화 메소드 / synchronized (0) | 2021.12.09 |
[JAVA] Scanner 클래스 / File 클래스 / 멀티 스레드 (0) | 2021.12.06 |
[JAVA] 필드 / 생성자 / 생성자 오버로딩 / this. 참조 / this() 다른생성자 호출 (0) | 2021.11.19 |
이클립스 워크스페이스 기본 경로 변경 / 프로젝트 익스플로어 창 사라졌을 때 (0) | 2021.11.19 |