쓰레드 ( Thread )
( 쓰레드를 사용한다고 해서 동시에 2 가지 이상의 프로세스를 처리할 수 있는 것은 아니다 )
( 매우 빠른 속도로 연산하기 때문에 동시에 처리되는 것으로 보이는 것이다 )
package thread;
class A01 extends Thread{
// 쓰레드를 상속
public void run() {
for(int i=0; i<100; i++)
System.out.println("i : " + i);
}
}
class B01 extends Thread{
// 쓰레드를 상속
public void run() {
for(int k=0; k<100; k++)
System.out.println("k : " + k);
}
}
public class Ex01 {
public static void main(String[] args) {
A01 a = new A01();
B01 b = new B01();
// 일반적인 메소드 사용 방식
// 순차적으로 모드가 진행됨
// a.run();
// b.run();
// 쓰레드를 사용하여 메소드사용하여
// 쓰레드를 적용하려면 start() 메소드를 사용하여 호출
a.start();
b.start();
}
}
상속받아 쓰레드를 사용하는 방법
package thread;
import java.util.Scanner;
class A03 extends Thread{
public void run() {
for( ; ; ) {
System.out.println("문자가 날라왔습니다!!!!");
try {
sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public class Ex03 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String str;
A03 a = new A03();
// setDaemon = 현재 쓰레드를 종료시켜준다는 의미
// 이 쓰레드의 종료 시점은 메소드가 실행된 곳이 종료되는 시점
// 즉, main 이 종료되는 시점에 a 쓰레드도 실행이 종료된다
a.setDaemon(true);
// 쓰레드 실행
a.start();
while(true) {
System.out.print("문자열 입력 : ");
str = sc.next();
System.out.println("입력한 값 : " + str);
if(str.equals("end")) {
System.out.println("종료합니다");
break;
}
}
System.out.println("main이 종료됩니다");
}
}
입력 받음을 유지하면서 일정 문구를 출력하는 코드
.setDaemon() - 이 메소드를 사용하여 쓰레드가 실행된 곳이 종료될때 쓰레드도 같이 종료되게끔 설정한다
package thread;
class Test04 extends Thread{
A04 a;
public Test04(A04 a, int num) {
this.a = a;
System.out.println(num + " -> a : " + a);
}
public void run() {
a.test();
}
}
class A04{
int sum = 1;
public synchronized void test() {
// synchronized 를 사용해 쓰레드가 공유하는 a 객체 자원을 동시에 사용하는
// 경우를 방지한다, 만약 동시에 연산을 시작하려고 하면 쓰레드 연산에 순서를
// 지정해준다
for(int i=1; i<10; i++) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(i + " : sum : " + sum);
sum += i;
}
}
}
public class Ex04 {
public static void main(String[] args) {
// 하나의 객체를 생성
A04 a = new A04();
Test04 t01 = new Test04(a, 1);
Test04 t02 = new Test04(a, 2);
Test04 t03 = new Test04(a, 3);
System.out.println("t01 : " + t01);
System.out.println("t02 : " + t02);
System.out.println("t03 : " + t03);
t01.start();
t02.start();
t03.start();
/*
A04 a1 = a;
a.test();
System.out.println(a1.sum);
a1.test();
System.out.println(a.sum);
*/
/*
// !!!싱글톤 패턴 사용!!!
// 생성된 객체를 공유
// 즉 a 와 같은 공간을 공유!!!
A04 a1 = a;
System.out.println("a : " + a); // a : thread.A04@2133c8f8
System.out.println("a1 : " + a1); // a1 : thread.A04@2133c8f8
a1.sum = 12345;
System.out.println(a.sum); // 12345
System.out.println(a1.sum); // 12345
*/
}
}
synchronized - 동기화
- 쓰레드가 자원을 공유해서 사용할 때 동일한 시간에 동일한 공유 자원을 사용하면 문제가 발생하는데 이때 syncronized 즉, 동기화를 사용해 쓰레드가 동시에 공유 자원을 사용하는 순간 사용 순서를 지정해줘서 문제를 해결시켜준다.
동기화 ( synchronized ) 사용과 사용하지 않는 경우의 차이점
728x90
'국비지원_핀테크' 카테고리의 다른 글
14일차_ [java] 회원 관리 프로젝트 ( DAO, DTO, Interface 활용 ) (0) | 2024.02.22 |
---|---|
14일차_ [java] 컬렉션 ( collection ), 객체 리스트 (0) | 2024.02.22 |
14일차_ [java] 람다 ( Lambda ) (0) | 2024.02.22 |
13일차_ [java] 싱글톤 ( Singleton ) 패턴 (0) | 2024.02.21 |
13일차_ [java] 추상 클래스 ( Abstract ), 인터페이스 ( interface ) (0) | 2024.02.21 |