스레드객체.setPriority(1~10 사이 정수 값)
단, 상대값이기 때문에 다른 실행환경에서의 모든 프로그램에서 동일한 실행을 보장하진 않는다
우선순위 값을 지정하지 않으면 기본값인 5를 지정
스레드 실행(start()) 전 호출해야 한다
CPU가 멀티코어인 경우에는 값이 다르게 나올 수 있다
스레드가 CPU에서 독립적으로 실행되면 우선순위가 높아도 결과값이 똑같이 출력되기 때문에
일정하지 않을 수 있음
(1) sleep(): 스레드 일시정지
(2) interrupt(): 스레드 종료
(3) join(): 다른 스레드 실행 완료 시까지 대기, 예외를 던지기 때문에 예외 처리를 해야한다
배경) 멀티스레드 환경에선 여러 스레드가 하나의 객체를 사용하는 경우 존재
각 스레드에서 해당 객체의 필드 값을 변경하고 있다면 의도한 대로 프로그램의 실행이 보장되지 않는다
(1) 동기화 메소드
synchronized 메소드명(){}
(2) 동기화 블록
synchronized (this) {}
데이터가 이동되는 통로
입력스트림 출력스트림
입력 → 프로그램 → 출력
파일 자바 파일
키보드 모니터
네트워크 네트워크
다른 프로그램 다른 프로그램
(1) FIFO 자료구조
(2) 단방향 처리; 입출력이 동시에 진행되는 것이 아니라 단방향으로망 처리 가능
(3) 데이터 종류에 따라 바이트/문자 구분
스트림 최상위 클래스(추상 클래스)
바이트 단위 스트림 문자단위 스트림
입력 | 출력 입력 | 출력
InputStream|OutputStream Reader|Writer|
메서드명 | 설명 |
---|---|
int read() | 1바이트 단위로 읽어 리턴 |
int read(byte[] b) | 매개변수 배열 길이 단위로 읽어 리턴 |
int read(byte[] b,int off,int len) | off부터 len 길이만큼 읽어 b 배열 단위로 리턴 |
void close() | 자원 해제 |
정수값을 리턴하며, 더 이상 읽어들일 것이 없으면 -1을 리턴
메서드명 | 설명 |
---|---|
void write(int b) | 1바이트 단위로 출력 |
void write(byte[] b) | 매개변수 배열 길이 단위로 출력 |
void write(byte[] b,int off,int len) | off부터 len 길이만큼 출력 |
void flush() | 출력 버퍼 초기화, 실제 출력 처리 기능 |
void close() | 자원 해제 |
문자 단위 스트림에선 write(String s)/write(String s,int off, int len) 메소드가 추가된다
중간 임시 저장소, 여유공간
만약 하드디스크의 노후화나 OS 문제로 인한 읽기 속도가 저하될 경우 프로그램 실행 자체도
느려진다. 이 때, 버퍼를 두어 버퍼에 저장 후 한꺼번에 처리하면 처리 속도가 향상된다
메서드명 | 설명 |
---|---|
BufferedInputStream | 바이트 단위 입력 보조 스트림 |
BufferedOutputStream | 바이트 단위 출력 보조 스트림 |
BufferedReader | 문자 단위 입력 보조 스트림 |
BufferedWriter | 문자 단위 출력 보조 스트림 |
(1) IP 컴퓨터를 구별하기 위해 사용되는 고유 값
(2) Port 컴퓨터가 서로 연결된 부분, 포트를 통해 네트워크 통신(정수 값)
(3) Socket 네트워크 상에서 각 컴퓨터가 포트를 통해 통신하는 끝부분(end point)
(4) Server 서비스를 제공하는 컴퓨터, 클라이언트의 요청에 대한 처리
(5) Client 서비스를 사용하는 컴퓨터(서버에 서비스 요청)
클래스 | 설명 |
---|---|
URL | 인터넷을 통한 서버 통신 |
URLConnection | URL 객체의 연결,추상 클래스이다. 하위 클래스:HttpURLConnection |
ServerSocket/Socket | 소켓(TCP/IP) 통신을 위한 클래스 |
DatagramPacket/DatagramSocket | UDP 통신을 위한 클래스 |
다른 API를 사용하거나 크롤링할 때 활용되기도 한다
구분 | TCP | UDP |
---|---|---|
특징 | 데이터 전송 신뢰성 높음, 전송 순서 보장 | 데이터 전송 신뢰성 낮음, 전송 순서 보장 안 됨 |
데이터 수신 여부 확인 가능, UDP에 비해 느림 | 데이터 수신 여부 확인 불가, TCP에 비해 빠름 | |
연결 방식 | 1대1 연결 후 통신 | 1대다 비연결 통신 |
(1) 서버는 서버 소켓을 사용해서 클라이언트에게 요청받을 준비
(2) 클라이언트는 서버 정보(IP나 Port 번호)를 통해 소켓 생성
(3) 서버에 연결 요청
(4) 서버는 클라이언트로부터 연결 요청을 받으면 소켓 생성 후 연결
(5) 서버 소켓과 클라이언트 소켓이 1대1 통신
public class ThreadEx extends Thread{
Socket client;
BufferedReader br;
PrintWriter pw;
ThreadEx(Socket client){
this.client = client;
try{
br = new BufferedReader(new InputStreamReader(client.getInputStream()));
pw = new PrintWriter(client.getOutputStream());
}catch(Exception e){
System.out.println(e.getMessage());
}
}
public void run(){
BufferedReader brClient = null;
DataOutputStream dos = null;
try{
String firstLine = br.readLine();
System.out.println(firstLine);
String fileName = firstLine.substring(firstLine.indexOf("/")+1,firstLine.lastIndexOf("HTTP")-1);
if("".contentEquals(fileName)) {
fileName="index.html";
}
brClient = new BufferedReader(new FileReader(fileName));
String data ="";
pw.println("HTTP/1.0 200 Document Follows \r\n");
while((data=brClient.readLine())!=null){
pw.println(data);
pw.flush();
}
} catch(Exception e){
System.out.println(e.getMessage());
}
}
}
Server.java
public class Server {
public static void main(String[] args) {
try{
DatagramSocket socket = new DatagramSocket(8888);
DatagramPacket packet = null;
byte[] msg = null;
while(true){
msg = new byte[1024];
packet=new DatagramPacket(msg,msg.length);
socket.receive(packet);
System.out.println("메시지: "+new String(msg,0,packet.getLength()));
}
} catch(Exception e){
}
}
}
Client.java
public class Client {
public static void main(String[] args) {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
try{
InetAddress server = InetAddress.getByName("127.0.0.1");
while(true){
String input = br.readLine();
DatagramSocket socket = new DatagramSocket();
byte[] msg = input.getBytes();
DatagramPacket packet = new DatagramPacket(msg,msg.length,server,8888);
socket.send(packet);
socket.close();
}
}catch(Exception e){
System.out.println(e.getMessage());
}
}
}