스레드 제어

스레드 객체를 생성하고 start() 메소드를 호출하면 바로 실행되는 것이 아니라 실행 대기 상태가 됩니다.

실행 대기 상태란 언제든지 실행할 준비가 되어 있는 상태를 말한다. 

실행 상태의 스레드는 run() 메소드를 모두 실행하기 전에 다시 실행 대기 상태로 돌아갈 수 있으며, 실행 대기 

상태에 있는 다른 스레드가 선택되어 실행 상태가 되기도 한다.

실행 상태에서 run() 메소드의 내용이 모두 실행되면 스레드의 실행이 멈추고 종료 상태가 된다.

 

 

 

스레드 상태

스레드 객체를 생성하고 start() 메소드를 호출하면 곧바로 스레드가 실행되는 것처럼 보이지만 사실은 실행 대기

상태가 된다. 실행 상태의 스레드는 run() 메소드를 모두 실행하기 전에 다시 실행 대기 상태로 돌아갈 수 있다.

그리고 실행 대기 상태에 있는 다른 스레드가 선택되어 실행 상태가 된다.

스레드는 실행 대기 상태와 실행 상태로 번갈아 변하면서, 경우에 따라서 실행 상태에서 일시정지 상태로 가기도

한다. 일시 정지 상태는 스레드가 실행할 수 없는 상태, 일시 정지 상태에서는 바로 실행 상태로 돌아갈 수 없고,

일시정지 상태에서 빠져나와 실행 대기 상태로 가야 한다.

 

 

 

스레드 상태 제어

스레드 상태 제어는 주어진 시간동안 일시 정지시키는 sleep() 메소드와 스레드를 안전하게 종료시키는 stop 플래그,

interrupt()메소드를 사용한다.

interrupt() : 일시 정지 상태의 스레드에서 InterruptedException을 발생시켜, 예외 처리 코드(catch)에서

                    실행 대기 상태로 가거나 종료 상태로 갈 수 있도록 한다.

sleep(1000) : 1000은 1초 / 주어진 시간 동안 스레드를 일시 정지 상태로 만든다. 주어진 시간이 지나면 자동적으로

                       실행 대기 상태가 된다.

stop() : 스레드를 즉시 종료한다. 불안전한 종료를 유발하므로 사용하지 않는 것이 좋다.

 

주어진 시간 동안 일시 정지

		try {
			Thread.sleep(1000);// 1초 동안 출력
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

해당 코드 처럼 일시 정지 상태에서 주어진 시간이 되기 전에 interrpt()메소드가 호출되면 InterruptedException이발생하기 때문에 예외 처리가 필요하다.

 

스레드의 안전한 종료

 

stop 플래그를 이용하는 방법

package sec02.exam01;

public class FlagEx {

	public static void main(String[] args) {
//		boolean stop; // stop 플래그 필드
		
		boolean stop = false;
		int i = 0;
		
		while(!stop) {// true
			System.out.println("진행 중");
			i++;
			if(i > 10) {
				stop = !stop;//false되면 멈추기
			}
		}
		System.out.println("완료");
	}

}
무한 반복해서 출력하는 스레드

package sec02.exam02;

public class PrintThread1 extends Thread {
	private boolean stop;
	
	public void setStop(boolean stop) {
		this.stop = stop;
	}
	
	
	public void run() {
		while(!stop) {
			System.out.println("실행중");
		}
		System.out.println("자원 정리");
		System.out.println("실행 종료");
	}
	

}


1초 후 출력 스레드를 중지

package sec02.exam02;

public class StopFlagEx {

	public static void main(String[] args) {
		PrintThread1 printThread1 = new PrintThread1();
		printThread1.start();
		
		try {
			Thread.sleep(1000);// 1초 동안 출력
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		printThread1.setStop(true);

	}

}
<결과>
1초동안 실행중 계속 출력 후 
자원 정리
실행 종료

 

interrupt() 메소드를 이용하는 방법

방법 (1) 선언

package sec02.exam03;

public class PrintThread extends Thread {

	@Override
	public void run() {
		// TODO Auto-generated method stub
		try {
			while(true) {
				System.out.println("실행 중");
				Thread.sleep(1);
			}
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			
		}
		System.out.println("자원 정리");
		System.out.println("실행 종료");
	}
	

}


방법 (2) 선언

package sec02.exam03;

public class PrintThread2 extends Thread {

	@Override
	public void run() {
		// TODO Auto-generated method stub
		while(true) {
			System.out.println("실행 중2");
			if(Thread.interrupted()) {
				break;
			}
		}
		
		System.out.println("자원 정리2");
		System.out.println("실행 종료2");
	}
	
	

}


실행

package sec02.exam03;

public class InterruptEx {

	
	public static void main(String[] args) {
//		방법 (1) 실행
//		Thread thread = new PrintThread();
//		thread.start();

//		방법 (2) 실행
		Thread thread2 = new PrintThread2();
		thread2.start();
		
//		방법 (1) 실행
//		try {
//			Thread.sleep(1000); // 1초 후 출력 스레드를 중지	
//		} catch (InterruptedException e) {
//			// TODO Auto-generated catch block
//
//		}
//		thread2.interrupt();

	}

}

 

데몬 스레드

주 스레드의 작업을 돕는 보조적인 역할을 수행하는 스레드이다. 주 스레드가 종료되면 데몬 스레드도 강제 종료

 

 

 

 

 

 

컬렉션 프레임워크

자료구조를 사용해서 객체들을 효율적으로 추가, 삭제, 검색할수 있도록 인터페이스와 구현 클래스를 java.util 

패키지에서 제공한다. 이들을 총칭해서 컬렉션 프레임워크라고 부른다.

컬렉션은 객체의 저장을 뜻하고, 프레임워크란 사용 방법을 정해놓은 라이브러리를 말한다. 실제로 컬렉션 프레임

워크는 사용 방법을 인터페이스와 실제 객체를 저장하는 다양한 컬렉션 클래스(구현클래스)를 제공한다.

컬렉션 프레임 워크의 주요 인터페이스로는 List, Set, Map이 있습니다.

 

List 컬렉션

배열과 비슷하게 객체를 인덱스로 관리한다. 차이점은 저장 용량이 자동으로 증가하며, 객체를 저장할 때 자동으로

인덱스가 부여된다는 것이다. 그리고 추가, 삭제, 검색을 위한 다양한 메소드들이 제공된다.

List 컬렉션은 객체 자체를 저장하는 것이 아니라 객체 번지를 참조한다. 그렇기 때문에 동일한 객체를 중복 저장할수 있는데, 이 경우 동일한 번지가 참조 된다. 밑에 이미지 참고

 

 

List 컬렉션에는 ArrayList, Vector, LinkedList 등이 있는데, 밑에 이미지는 List 컬렉션에서 공통적으로

사용 가능한 List 인터페이스 메소드이다. 인덱스로 객체를 관리하기 때문에 인덱스를 매개값으로 갖는

메소드가 많다.

메소드의 매개 변수 타입과 리턴 타입에 E라는 타입 파라미터가 있는데, 이것은 저장되는 객체의 타입을 List 

컬렉션을 생성할 때 결정하라는 뜻 이다.

 

List<String> List = new ArrayList<String>();
		
		List.add("java");// 객체 추가
		List.add("JDBC");
		List.add("Servlet/JSP");
		List.add(2, "Database");// 지정되 인덱스에 객체 삽입
		List.add("iBATIS");
        String str = list.get(1); // 인덱스로 객체 검색
        list.remove(0); // 인덱스로 객체 삭제
        list.remove("신용권"); // 객체 삭제

객체를 추가하면 0번 인덱스부터 차례대로 저장되지만 특정 인덱스의 객체를 제거하면 바로 뒤 인덱스부터 마지막 인덱스

까지 모두 앞으로 1씩 당겨진다. 마찬가지로 특정 인덱스에 객체를 삽입하면 해당 인덱스부터 마지막 인덱스까지 모두 1씩

밀려나게 된다. 

 

 

Vector

Vector는 ArrayList와 동일한 내부 구조를 가지고 있다. ArrayList와 다른 점은 Vector는 동기화된 메소드로 구성되어 

있기 때문에 멀티 스레드가 동시에 Vector의 메소드들을 실행할 수 없고, 하나의 스레드가 메소드를 실행을 완료해야만

다른 스레드가 메소드를 실행할 수 있다는 것이다.

선언

package sec02.exam04;

public class Board {
	String subject;
	String content;
	String writer;
	
	
	public Board(String subject, String content, String writer) {
		super();
		this.subject = subject;
		this.content = content;
		this.writer = writer;
	}


	@Override
	public String toString() {
		return "Board [subject=" + subject + ", content=" + content + ", writer=" + writer + "]";
	}
	
	
	
	
}


실행

package sec02.exam04;

import java.util.List;
import java.util.Vector;

public class VetorEx {

	public static void main(String[] args) {
		List<Board> list = new Vector<Board>();
		
		list.add(new Board("제목1", "내용1", "글쓴이1"));
		list.add(new Board("제목2", "내용2", "글쓴이2"));
		list.add(new Board("제목3", "내용3", "글쓴이3"));
		list.add(new Board("제목4", "내용4", "글쓴이4"));
		list.add(new Board("제목5", "내용5", "글쓴이5"));
		
		list.remove(2); // 2번 인덱스 객체(제목3) 삭제 ( 뒤의 인덱스는 1씩 앞으로 당겨짐 )
		list.remove(3); // 3번 인덱스 객체(제목5) 삭제
		
//		for(int i=0; i < list.size(); i++) {
//			Board border = list.get(i);
//			System.out.println(border.subject + "\t" 
//								+ border.content+ "\t" 
//								+ border.writer + "\t" );
//		}
		
		for(Board board : list) {
			System.out.println(board);
		}

	}

}
<결과>

Board [subject=제목1, content=내용1, writer=글쓴이1]
Board [subject=제목2, content=내용2, writer=글쓴이2]
Board [subject=제목4, content=내용4, writer=글쓴이4]

 

 

 

Set 컬렉션

List 컬렉션은 객체의 저장 순서를 유지하지만, Set 컬렉션은 저장 순서가 유지되지 않는다. 또한 객체를 중복해서

저장할 수 없고, 하나의 null만 저장할 수 있다. 

Set 컬렉션은 수학의 집합과 비슷하다. 집합은 순서와 상관없고 중복이 허용되지 않기 때문이다.

 

Iterator ( 반복자 패턴 ) 

package sec02.exam05;

import java.util.ArrayList;
import java.util.Iterator;

public class IteratorEx {

	public static void main(String[] args) {
		ArrayList<String> cars = new ArrayList<>();
		cars.add("벤츠");
		cars.add("아우디");
		cars.add("페라리");
		cars.add("기아차");
		// 이터레이터 패턴 ( 반복자 패턴 )
		Iterator<String> it = cars.iterator();
		while(it.hasNext()) { // hasNext() 가져올 객체가 있으면 true를 리턴 없으면 false을 리턴
			String str = it.next();// next() 컬렉션에서 하나의 객체를 가져 온다.  
			System.out.println(str);
		}

	}

}
<결과>
벤츠
아우디
페라리
기아차

 

HashSet

package sec02.exam06;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class HashSetEx {

	public static void main(String[] args) {
		Set<String> set = new HashSet<String>();
		
		// "Java"는 한번만 저장됨
		set.add("Java");
		set.add("JDBC");
		set.add("Servlet/JSP");
		set.add("Java");
		set.add("iBATIS");
		
		int size = set.size();// 저장된 객체 수 얻기
		System.out.println("총 객체수: " + size);
		
		Iterator<String> iterator = set.iterator();// 반복자 얻기
		while(iterator.hasNext()) { // 객체 수만큼 루핑
			String element = iterator.next();// 1개에 객체를 가져옴
			System.out.println("\t" + element);
		}
		
		set.remove("JDBC"); // 삭제
		set.remove("iBATIS"); // 삭제
		
		System.out.println("총 객체수 : " + set.size());
		
		iterator = set.iterator();// 반복자 얻기
		for(String element : set) {// 객체 수만큼 루핑
			System.out.println("\t" + element);
			
		}
		set.clear();// 모든 객체를 제거하고 비움
		
		if(set.isEmpty()) { // 위에 코드 비워 졌는지 확인
			System.out.println("비어 있음");
		}

	}

}
<결과>
총 객체수: 4
	Java
	JDBC
	Servlet/JSP
	iBATIS
총 객체수 : 2
	Java
	Servlet/JSP
비어 있음

'프로젝트 기반 자바(JAVA) 응용 SW개발자 취업과정' 카테고리의 다른 글

2023-06-26 27일차  (0) 2023.06.26
2023-06-22 25일차  (0) 2023.06.22
2023-06-20 23일차  (0) 2023.06.20
JDBC_설정(MariaDB, 이클립스)  (1) 2023.06.17
2023-06-16 21일차  (0) 2023.06.16

+ Recent posts