45. 자바 스레드풀 적용하기 - excuter 사용법
스레드는 런 끝나면 dead 상태로 가고 가비지가 되어 다시 불러올 수 없음.
가비지가 쌓여서 메모리 낭비, 생성하는 데에도 시간 걸리구 영,, 아님
스레드를 재활용하는 방법: 스레드를 멈추지 않게 만드는 것 ,,!! 일이 끝나면 대기 상태로 보내기.
대기일 때 셋팅하고 다시 깨우고. this.wait - 값 넣구 - notify
sleep 은 일정 시간 지나면 알아서 깨어나고, wait는 notify로 깨워야함.
스레드가 running 상태에서 not runnable 상태로 보내는 거: sleep & wait
잠깐 멈춘 스레드를 리스트 컬렉션에 담았다가 꺼내는 거임 - 스레드풀
1. 스레드 풀 생성,
ExecutorService executorService = Executors.newFixedThreadPool(3);
2.인터페이스에 따라 만든 객체 생성(ExecutorService)
3. execute() 안에 runnable 객체 넣음.
4. (스레드풀 안에서) 스레드 생성/ 꺼내기
5. 꺼내지고
6. 실행 ! - 메인 메서드, 메인 스레드가 실행이 끝나도 스레드 풀에 있는 스레드가 다 끝나지 않으면 jvm은 안 끝나고 기다림. run 안에 든거 반복함: 스레드가 실행을 완료한 후에 대기 상태가 되기 때문에 영원히 종료되지 않는다.
* 스레드풀 종료시키기
1 메인스레드가 excutors에 스레드풀 생성 요청하고
2 excutor가 excutor Service 구현체로 생성함.
3 메인스레드가 저 구현체에 작업(실행) 요청.
4 종료 요청 shutdown() - 실행한다고 즉시 종료되는것이 아님 ! 요청임 / 지금 당장 하라는게 아니고 모든 스레드가 대기상태로 들어가면 멈춰라 ~~!!!
5 구현체가 스레드 실행
6. 스레드는 run()을 호출해서 Runnable 구현체 실행
7. 실행 값 리턴
8. 스레드 wait()
9. Excutor Service가 실행 중인 스레드가 없다면 스레드 풀 종료
10 JVM 종료
* 스레드풀의 크기를 초과해서 작업 수행을 요청한다면?
- 놀고 있는 스레드가 없을 경우, 다른 스레드의 작업이 끝날 때까지 작업큐에 대기하고 있는다. 작업을 끝낸 스레드가 생기면 큐에서 작업을 꺼내 실행한다.
executorService.execute(new MyRunnable(6000));
executorService.execute(new MyRunnable(3000));
executorService.execute(new MyRunnable(9000));
//
executorService.execute(new MyRunnable(2000));
executorService.execute(new MyRunnable(4000));
Executors.newCachedThreadPool();
스레드의 수를 고정하지 않고 필요할 때마다 스레드를 생성하는 스레드풀이다.
물론 작업을 끝낸 스레드는 다시 사용할 수 있도록 pool에 보관한다.
ExecutorService executorService = Executors.newCachedThreadPool();
한 개의 스레드만 갖는 스레드풀
ExecutorService executorService = Executors.newSingleThreadExecutor();
// 스레드가 한 개이기 때문에 순차적으로 실행한다.
executorService.execute(new MyRunnable(6000));
executorService.execute(new MyRunnable(3000));
executorService.execute(new MyRunnable(9000));
executorService.execute(new MyRunnable(2000));
executorService.execute(new MyRunnable(4000));
Executors 태스크 프레임워크 - 작업 실행 : execute()
스레드풀에 수행할 작업을 등록한다.
스레드풀은 execute()를 호출한 순서대로 작업큐에 작업을 보관한다.
그리고 놀고 있는 스레드가 있다면, 작업큐에서 작업을 꺼내 수행시킨다.
놀고 있는 스레드가 없으면, 새로 스레드를 생성한다.
스레드가 최대 개수라면 기존 스레드가 작업을 끝낼 때까지 기다린다.
=> 수행한 작업의 종료 여부를 확인할 수 없다.
Executors 태스크 프레임워크 - 작업 실행 : submit()
=> 작업의 종료 상태를 확인할 수 있는 Future 객체를 리턴한다.
Future.get()
=> 요청한 작업이 완료될 때 까지 기다린다.(pending)
=> 요청한 작업이 완료되면 null을 리턴한다
List<Runnable> tasks = executorService.shutdownNow();
가능한 현재 수행 중인 작업들을 모두 멈추도록 지시한다.
=> shutdown()과 차이점:
- 만약 Running 상태의 스레드가 Not Runnable 상태(sleep()/wait())에 놓인다면,
스레드를 멈출 기회라고 보고 스레드 강제 종료할 것이다.
- 즉, 실행 중인 작업만 완료시키고, 대기 중인 작업은 취소하는 효과가 있다.
=> Running 상태일 때는 작업이 끝나거나 not runnable 상태가 될 때까지 기다린다.
=> 그리고 취소한 대기 작업 목록을 리턴해준다.
shutdown() vs shutdownNow();
- shutdown()
진행 중인 작업을 완료하고 대기 중인 작업도 완료한 다음 종료.
- shutdownNow()
진행 중인 작업은 완료하고, 대기 중인 작업은 취소하고 그 목록을 한다.
List<Runnable> tasks = executorService.shutdownNow();
System.out.println("실행 취소된 작업들:");
System.out.println("--------------------------------");
for (Runnable task : tasks) {
System.out.println(((MyRunnable) task).millisec);
}
System.out.println("--------------------------------");
Executors 태스크 프레임워크 - 스레드풀 종료 대기 : awaitTermination()
public static void main(String[] args) throws Exception {
ExecutorService executorService = Executors.newFixedThreadPool(3);
executorService.execute(new MyRunnable(6000));
executorService.execute(new MyRunnable(2000));
executorService.execute(new MyRunnable(4000));
executorService.execute(new MyRunnable(15000));
executorService.shutdown();
// 스레드풀의 모든 스레드가 종료되면 즉시 true를 리턴한다.
// 만약 지정된 시간(예: 10초)이 경과할 때까지 종료되지 않았다면 false를 리턴한다.
//
if (!executorService.awaitTermination(10, TimeUnit.SECONDS)) {
System.out.println("아직 종료 안된 작업이 있다.");
} else {
System.out.println("모든 작업을 종료하였다.");
}
System.out.println("main() 종료!");
}
public static void main(String[] args) throws Exception {
ExecutorService executorService = Executors.newFixedThreadPool(3);
executorService.execute(new MyRunnable(6000));
executorService.execute(new MyRunnable(2000));
executorService.execute(new MyRunnable(4000));
executorService.execute(new MyRunnable(20000));
// 실행 중인 작업 및 대기 중인 작업이 모두 끝나면 스레드풀을 종료하라.
executorService.shutdown();
// 스레드풀의 모든 스레드가 종료될 때까지 기다린다.
if (!executorService.awaitTermination(10, TimeUnit.SECONDS)) {
System.out.println("아직 종료 안된 작업이 있다.");
System.out.println("남아 있는 작업의 강제 종료를 시도하겠다.");
// => 만약 10초가 경과될 때까지 종료되지 않으면,
// 수행 중인 작업을 강제 종료하라고 지시한다.
// 강제 종료?
// => 일단 대기 중인 작업은 모두 취소한다.
// => 실행 중인 스레드 중 Not Runnable 상태에 있는 스레드는 강제 종료한다.
// => 그 외 running 상태의 스레드는 강제 종료할 수 없다.
// 예) 입.출력 대기 상태는 running 상태이다. Not Runnable 상태가 아니다.
executorService.shutdownNow();
// 그리고 다시 작업이 종료될 때까지 기다린다.
if (!executorService.awaitTermination(5, TimeUnit.SECONDS)) {
System.out.println("스레드풀의 강제 종료를 완료하지 못했다.");
} else {
System.out.println("모든 작업을 강제 종료했다.");
}
}
System.out.println("main() 종료!");
}
}
45.
myapp 수정
server앱 수정, util 다 지움
46. DBMS 도입하기
* DBMS와 통신
DBMS Client API : JDBC 멩세에 따라 만든 API 도구라는 의미로 "JDBC Driver"라고 함.
DBMS와의 통신 담당 ,
DBMS 전용 프로토콜에 따라 통신,
DBMS에 상관없이 API 사용법을 통일 시키기 위해 자바에서 정의한 JDBC 규칙에 따라 만들었다. ,
(JDBC: Java Database Conectivity)
DBMS 제조사에서 제공해준다.
=> 클라이언트 개발자는 통신 프로그래밍을 할 필요가 없다.
*DBMS에 데이터 처리를 요청하기
데이터 처리 명령문은 SQL 문법에 맞춰 작성한다.
SQL: Structured Query Language / 구조적인 문법을 갖춘 데이터 처리 명령 언어 , 표준 언어 (DBMS 종류에 상관없이 사용할 수 있다)
서비스에서 실행 중지 가능
mysql은 클라이언트 프로그램임
로컬 MySQL 서버에 접속
> mysql -u root -p
MySQL 서버
MySQL.exe가 클라이언트 프로그램임.
실습 준비
1. 실습 사용자 추가
2. 실습 사용자가 쓸 데이터베이스 추가
3. 데이터베이스를 실습사용자가 쓸 수 있도록 권한을 부여
4. 접속 테스트
*MySQL 사용자 추가
1. 사용자 추가
> CREATE USER '사용자아이디'@'원격호스트주소' IDENTIFIED BY '암호'
=> 로컬에서만 접속할수있는 사용자 create user 'study'@'localhost' identified by '1111';
=> 원격에서만 접속할 수 있는 create user 'study'@'%' identified by '1111';
=> 둘 다 시키려면? : 둘 다 등록하기
2. 테이블 요약 정보
describe mysql.user;
desc. database. table명
3. user, host만 가져와라
select user, host from mysql.user;
user & host: column, mysql = database, user = table
4. id 삭제하기
drop user 'study'@'localhost';
5. 데이터 베이스 생성
create database 데이터베이스명 set utf8 옵션들
create database studydb character set utf8 collate utf8_general_ci;
6. 사용자가 사용할 수 있는 데이터베이스 목록 조회
show databases ;
7.database 삭제하기
drop database studydb;
8. database 사용권한 부여
grant all on studydb.* to 'study'@'localhost';
all : 권한의 종류 (select, update, insert)
studydb: database
* : 특정항목: table, view, procedure
'study'@'localhost' : 접속할 유저
mysql> grant all on studydb.* to 'study'@'localhost';
9. 나가기
qui, exit
10. DBMS에 접속
mysql -u 사용자아이디 'p'
새로 접속 : PS C:\Users\bitcamp> mysql -u study -p
11. 테이블 준비
create table studydb. test(no int, name varchar(20));
studydb: database
varchar(20) : 최대 20자를 저장 . (한글/ 영어)
12. 데이터 베이스의 테이블 조회
show tables from studydb;
describe studydb.test;
13. 기본으로 사용할 database 지정
use studydb;
show tables; (= show tables from studydb)
desc test; (= describe studydb.test;)
'[네이버클라우드] 클라우드 기반의 개발자 과정 7기 > 웹프로그래밍' 카테고리의 다른 글
[NC7기-60일차(7월19일)] - 웹프로그래밍 41일차 (0) | 2023.07.19 |
---|---|
[NC7기-59일차(7월18일)] - 웹프로그래밍 40일차 (0) | 2023.07.18 |
[NC7기-57일차(7월14일)] - 웹프로그래밍 38일차 (0) | 2023.07.14 |
[NC7기-56일차(7월13일)] - 웹프로그래밍 37일차 (0) | 2023.07.13 |
[NC7기-55일차(7월12일)] - 웹프로그래밍 36일차 (0) | 2023.07.12 |