SW과정 JAVA 6일차 - 0802

JongseokLee·2021년 8월 2일
0
post-thumbnail

SW과정 JAVA 6일차 - 0802

1. 쓰레드

동작하고 있는 프로그램을 프로세스(Process)라고 한다. 보통 한 개의 프로세스는 한 가지의 일을 하지만, 이 쓰레드를 이용하면 한 프로세스 내에서 두 가지 또는 그 이상의 일을 동시에 할 수 있게 된다.

2. 공유자원

여러 쓰레드가 공유 자원에 접근할 때 동기화를 통해서 정확한 값을 제공해줘야 함, supply 클래스는 일정 시간마다 일정 데이터를 제공함, consumer 쓰레드로 구현이 되어있음, supply로 부터 생성된 데이터를 consumer(쓰레드)가 소비함, wait되어 있는 자원을 가동시킬 때는 notify 메소드 사용, 수동으로 우선순위 적용 가능 우선순위가 낮으며 가동 불가. 이러한 경우에는 notify all 메서드로 작동 가능함(wait 되어있는 모든 스레드 가동)

3. Thread 활용 햄버거 가게 코드

package com.busan.fullstack.thread;

public class HamTestMain {
	static Supply sp = new Supply();
	
	public static void main(String[] args) {
			sp.start();
			Consumer cs = new Consumer();
			Consumer cs1 = new Consumer();
			Consumer cs2 = new Consumer();
			Consumer cs3 = new Consumer();
			cs.start();
			cs1.start();
			cs2.start();
			cs3.start();

	}
}

package com.busan.fullstack.thread;

public class Supply extends Thread {
	static int ham = 10;
	int j =1;
	static int i=1;
	
	@Override
	public void run() {
		while(true) {
			try {
				Thread.sleep(3000);
				make();
			}catch(Exception e) {
				e.printStackTrace();
			}
		}
	}
	
	public synchronized void make() {
		ham=ham+1;
		System.out.println(j+" 번째 햄버거 공급");
		notify();
		j++;
	}
	
	public synchronized void buy() {
		Thread t = Thread.currentThread();
		while(ham==0) {
			System.out.println("햄버거 다 팔림");
			System.out.println("wait된 쓰레드"+t.getName());
			try {
				wait();
				System.out.println("wait에서 깨어난 쓰레드"+t.getName());
				System.out.println("쓰레드 상태"+t.getState());
			}catch(Exception e) {
				e.printStackTrace();
			}
		}
		ham = ham-1;
		System.out.println(t.getName()+" "+i+" 번째 햄버거 팔림");
		i++;
	}
}

package com.busan.fullstack.thread;

public class Consumer extends Thread {

	@Override
	public void run() {
		while(true){
			try {
				HamTestMain.sp.buy();
				this.sleep(2000);
			}catch(Exception e) {
				e.printStackTrace();
			}
		}
	}
	
}

<Result>

Thread-1 1 번째 햄버거 팔림
Thread-2 2 번째 햄버거 팔림
Thread-3 3 번째 햄버거 팔림
Thread-4 4 번째 햄버거 팔림
Thread-3 5 번째 햄버거 팔림
Thread-1 6 번째 햄버거 팔림
Thread-4 7 번째 햄버거 팔림
Thread-2 8 번째 햄버거 팔림
1 번째 햄버거 공급
Thread-3 9 번째 햄버거 팔림
Thread-4 10 번째 햄버거 팔림
Thread-1 11 번째 햄버거 팔림
햄버거 다 팔림
wait된 쓰레드Thread-2
2 번째 햄버거 공급
wait에서 깨어난 쓰레드Thread-2
쓰레드 상태RUNNABLE
Thread-2 12 번째 햄버거 팔림
햄버거 다 팔림
wait된 쓰레드Thread-3
햄버거 다 팔림
wait된 쓰레드Thread-4
햄버거 다 팔림
wait된 쓰레드Thread-1
햄버거 다 팔림
wait된 쓰레드Thread-2
3 번째 햄버거 공급
wait에서 깨어난 쓰레드Thread-3
쓰레드 상태RUNNABLE
Thread-3 13 번째 햄버거 팔림
햄버거 다 팔림
wait된 쓰레드Thread-3
4 번째 햄버거 공급
wait에서 깨어난 쓰레드Thread-4
쓰레드 상태RUNNABLE
Thread-4 14 번째 햄버거 팔림
햄버거 다 팔림
wait된 쓰레드Thread-4
5 번째 햄버거 공급
wait에서 깨어난 쓰레드Thread-1
쓰레드 상태RUNNABLE
Thread-1 15 번째 햄버거 팔림
햄버거 다 팔림
wait된 쓰레드Thread-1

4. StringTokenizer

공백이나 지정한 구분자가 있다면 뒤에 문자열이 공백 자리를 땡겨와서 매꿔주는 클래스이다. 그래서 BufferedReader에서 split 메소드를 사용해 잘라서 사용하는 것보다 속도가 훨씬 빠르다. 정규식이나 인덱스 접근과 같은 처리가 필요없다면 StringTokenier를 사용하는 것이 훨씬 효율적이다.

StringTokenizer 기본 구조

package com.busan.fullstack;

import java.util.StringTokenizer;

public class StringTokenizerTest {
	public void test() {
		String test1="a b d e f";
		StringTokenizer st1 = new StringTokenizer(test1);
		while(st1.hasMoreTokens()) {
			System.out.println(st1.nextToken());
		}
		
		String test="a b d f l zz";
		StringTokenizer st = new StringTokenizer(test,"&");
		while(st.hasMoreTokens()) {
			System.out.println(st.nextToken());
		}
	}
	
	public static void main(String[] args) {
		StringTokenizerTest stt = new StringTokenizerTest();
		stt.test();
	}
}

5. BBSDTO

~Dto(Data Transfer Object), ~VO(Value Object) JavaBean 이라 부름, 테이블에 있는 각 레코드 값을 답하는 역할을 하거나, 화면(view단)에서 사용자가 입력하는 값을 저장하는 역할을 함

articleNumidtitlecontentwirteDate
1jongseok123잠온다피곤피곤2021.08.02
package com.busan.fullstack.dto;

import java.sql.Timestamp;

public class BBSDto {
	private int articleNum;
	private String id;
	private String title;
	private String content;
	private Timestamp wirteDate;
}

6. 오라클 데이터 베이스

오라클 다운로드 바로가기 👆
SQL 다운로드 바로가기 👆

-오라클 접속 방법

  • 1) 오라클 드라이버 로드(Class.forName()사용)
  • 2) DriverManager의 getConnection() 이용하여 db접속 Connection 리턴 받음
  • 3) Connection의 prepareStatement()를 이용하여 쿼리문을 심고 PreparedStatement 리턴 받음
  • 4) PreparedStatement를 이용하여 쿼리실행
  • 5) 쿼리문 실행은 두가지가 있음
    • a. select문 : executeQuery()
    • b. insert, delete, update 문 : executeUpdate()
  • 6) 5번의 경우에서 a는 ResultSet을 리턴 받음, b는 정수를 리턴받음
  • 7) select문을 쿼리로 실행했으면 ResultSet을 이용하여 리턴 받음 값을 읽어내야함
profile
DataEngineer Lee.

0개의 댓글