728x90
반응형
Thread
동시에 서로 다른 작업을 수행하기 위한 클래스
웹서버는 전부 스레드기반이다.
왜냐하면 하나의 요청이 들어오면 그요청을 전부처리하기전까지 다른 요청을 수행하지 못하기때문에
1) Thread 클래스를 상속받는다.
2) public void run()을 오버라이딩하여 내용을 작성한다.
3) 객체를 생성한 후 start() 메서드를 호출하여 동시작업으로 수행한다.
package thread;
class JobA extends Thread {
@Override
public void run() {
// a가 65 z가 90
for(char ch = 'A'; ch <= 'Z'; ch++) {
System.out.print(ch+" ");
}
}
}
class JobB extends Thread {
@Override
public void run() {
for(int i =1; i <= 25; i++) {
System.out.print(i+ " ");
}
}
}
public class Ex01 {
public static void main(String[] args) {
// Thread : 동시에 서로 다른 작업을 수행하기 위한 클래스
JobA th1 = new JobA();
JobB th2 = new JobB();
// th1.run(); // 일반적인 메서드 호출을 진행하여
// th2.run(); // 다중 스레드로 작동하지 않는다.
th1.start(); // run의 내용을 별도의 스레드를 생성하여
th2.start(); // 새로운 스레드 내부에서 실행한다.
}
}
일반적으로는 하나의 객체에 정의된 함수를 먼저 수행하고 다음 줄의 함수를 수행하게된다.
하지만 스레드를 쓰면 각각의 스레드가 서로다른 함수를 수행할 수 있게된다.
Runnable
내가 만드는 작업클래스가 이미 다른 클래스를 상속받고 있다면?
스레드는 상속을 받아서 구현하는데 자바는 클래스의 다중상속을 허용하지 않는다.
Runnable 인터페이스를 구현하여 내부 run을 오버라이딩 한다.
run은 다중스레드로써 작동하지 않는다.
runnable은 start 메서드가 없다
runnable을 생성자 매개변수에 전달
runnable을 참조하는 thread의 start호출
package thread;
class JobC extends Object implements Runnable{
@Override
public void run() {
for(char ch = 'a'; ch <= 'z'; ch++) {
System.out.print(ch+ " ");
}
}
}
public class Ex02 {
//main함수도 하나의 스레드 안에서 작동한다.
public static void main(String[] args) {
JobC ob = new JobC();
ob.run(); //run은 다중스레드로써 작동하지 않는다.
// ob.start(); //runnable은 start메서드가 없다.
Thread th = new Thread(ob);
th.start();
for(int i =0; i<25; i++) {
System.out.print(i+ " ");
}
System.out.println();
}
}
정해진 시간동안 입력가능하고
타이머가끝나면 입력이 종료되고 입력한 내용을 출력하는 코드
Thread 클래스에는 isAlive() 메서드를 이용해서 스레드의 동작 여부를 판별할 수 있다.
package thread;
import java.util.ArrayList;
import java.util.Scanner;
class Timer implements Runnable {
@Override
public void run() {
for(int i =10; i!= -1; i--) { //10부터 0까지 1씩 감소하면서
System.out.printf("%02d : %02d\n", i/60, i%60); //시간출력
try {
Thread.sleep(1000); // 1초기다리기
} catch(InterruptedException e) {}
}
}
}
class StringInput implements Runnable {
private Scanner sc = new Scanner(System.in);
private ArrayList<String> list = new ArrayList<String>();
private Thread timer;
public StringInput(Thread timer) { //객체생성시 timer 스레드가 필요하다
this.timer = timer;
}
@Override
public void run() {
//Thread 클래스에는 isAlive() 메서드를 이용해서 스레드의 동작 여부를 판별할 수 있다.
while(timer.isAlive()) { //타이머 스레드가 동작중이라면 반복
//타이머 스레드가 종료되면 더이상 입력받지않는다.
System.out.print("입력 : "); //입력 프롬프트
list.add(sc.nextLine()); //입력받은 문자열을 리스트에 추가한다.
}
System.out.println("입력 끝, 출력 시작"); // 반복이 끝나면
list.forEach(System.out::println); // 리스트의 각 내용을 출력
System.out.println();
}
}
public class Ex03 {
public static void main(String[] args) {
Timer timer = new Timer();
Thread th1 = new Thread(timer);
StringInput input = new StringInput(th1);
Thread th2 = new Thread(input);
th2.start();
th1.start();
}
}
File (파일 입출력)
자바에서 파일및 디렉토리를 다루기위해서
사용하는 File 클래스
파일클래스를 사용하는 이유
메모리는 전원이 공급되는동안에만 데이터가 유지된다.
cpu가 메모리에 저장된데이터를 빠르게 읽고 쓰게 되지만, pc가 종료되면 날아가버린다.
그래서 데이터를 비휘발성 메모리인 하드디스크에 저장해놓고 데이터를 지속적으로 보관할 수 있다.
public class Ex05 {
public static void main(String[] args) throws IOException {
//파일 입출력에 관련해서 발생할 수 있는 예외 IOException
File f1 = new File("a.txt");
File f2 = new File("c:\\upload", "b.txt");
File dir = new File("c:\\upload");
File f3 = new File(dir, "c.txt");
//자바에서 파일 객체를 생성한다고 해서, 실제디스크에 파일이 만들어지는 것이 아니다.!!
System.out.println("f1이 존재하는가 : " + f1.exists());
System.out.println("f2이 존재하는가 : " + f2.exists());
System.out.println("dir이 존재하는가 : " + dir.exists());
System.out.println("f3이 존재하는가 : " + f3.exists());
System.out.println();
if(f1.exists() == false) {
boolean flag1 = f1.createNewFile();
System.out.println("f1이 생성되었는가 : " +flag1);
}
if(dir.exists()) {
boolean flag2 = dir.delete();
System.out.println("dir가 삭제되었는가 : " + flag2);
}
System.out.println("f1이 존재하는가 : " + f1.exists());
System.out.println("f1이 읽기 가능한가 : " + f1.canRead());
System.out.println("fl이 쓰기 가능한가 : " + f1.canWrite());
System.out.println("f1이 실행가능한가 : " + f1.canExecute());
System.out.println("f1이 파일인가 :" + f1.isFile());
System.out.println("f1이 디렉토리(폴더)인가 : " + f1.isDirectory());
System.out.println();
}
}
해당 코드는 파일 및 디렉토리를 다루는 Java의 File 클래스를 활용한 예제
주어진 코드에서 주요한 내용을 설명
1. 파일 및 디렉토리 경로 설정: - `File f1 = new File("a.txt");`: "a.txt"라는 파일 경로를 생성
-`File f2 = new File("c:\\upload", "b.txt");`: "c:\\upload" 디렉토리 안에 "b.txt"라는 파일 경로를 생성
- `File dir = new File("c:\\upload");`: "c:\\upload"라는 디렉토리 경로를 생성
- `File f3 = new File(dir, "c.txt");`: "c:\\upload" 디렉토리 안에 "c.txt"라는 파일 경로를 생성
2. 파일 및 디렉토리 존재 여부 확인: - `f1.exists()`: 파일 f1이 존재하는지 확인
- `f2.exists()`: 파일 f2가 존재하는지 확인
- `dir.exists()`: 디렉토리 dir이 존재하는지 확인
- `f3.exists()`: 파일 f3가 존재하는지 확인
3. 파일 생성 및 삭제:
- `f1.createNewFile()`: 파일 f1을 생성
- `dir.delete()`: 디렉토리 dir을 삭제
4. 파일 및 디렉토리 속성 확인: - `f1.canRead()`: 파일 f1을 읽을 수 있는지 확인
- `f1.canWrite()`: 파일 f1에 쓸 수 있는지 확인
- `f1.canExecute()`: 파일 f1을 실행할 수 있는지 확인
- `f1.isFile()`: 파일 f1이 파일인지 확인
- `f1.isDirectory()`: 파일 f1이 디렉토리(폴더)인지 확인
위의 코드는 파일 및 디렉토리를 생성하고 확인하는 등의 작업을 수행하며
, 파일 및 디렉토리의 존재 여부, 속성 등을 확인하는 방법을 보여준다.
파일을 생성하고
FileWriter클래스를 이용해서 파일에 기록해보자
package file;
import java.io.File;
import java.io.FileWriter;
public class Ex08 {
public static void main(String[] args) throws Exception{
File f = new File("a.txt");
if(f.exists() == false) {
f.createNewFile();
}
//기존내용을 유지하고 아래쪽에 내용을 추가할 것인가?
boolean append = true;
FileWriter fw = new FileWriter(f,append);
fw.append("Hello\n");
fw.append("world\n");
fw.append("java\n");
fw.append("한글\n");
fw.flush();
fw.close();
System.out.println("완료");
}
}
boolean append를 false로 바꾸면 기존의 내용이 날아가고 새로 덮어씌워진다.
프로젝트폴더에 ex09.txt 파일을 생성한 다음
FileWriter 를 이용하여 본인의 이름과 생일을 기록하세요
이름은 첫줄, 생일은 월과 일만 두번 째 줄에 기록하세요
package file;
import java.io.File;
import java.io.FileWriter;
import java.util.Scanner;
public class Ex09 {
public static void main(String[] args) throws Exception {
// 프로젝트폴더에 ex09.txt 파일을 생성한 다음
// FileWriter 를 이용하여 본인의 이름과 생일을 기록하세요
// 이름은 첫줄, 생일은 월과 일만 두번 째 줄에 기록하세요
File f = new File("ex09.txt");
if (f.exists() == false) {
f.createNewFile();
}
boolean append = false;
FileWriter fw = new FileWriter(f, append);
//txt파일에 이름 기록
fw.append("임지훈\n");
// 생일 기록
fw.append("0408\n");
fw.flush();
fw.close();
System.out.println("완료");
//만약에 파일이 존재한다면
if (f.exists()) {
//스캐너 객체 생성 매개변수로 f받아줌
Scanner sc = new Scanner(f);
// 다음 줄이 있다면 루프
while (sc.hasNextLine()) {
// write로 한줄씩 출력
String write = sc.nextLine();
System.out.println(write);
// 0.5초 간격으로
Thread.sleep(500);
}
//스캐너 닫아줌
sc.close();
}
}
}
파일의 절대경로를 알고있으면 명령어로 실행할 수 있다.
명령어로 런타임을 만들어서 운영체제에 전달하는 방법 Runtime
728x90
반응형
'JAVA기초' 카테고리의 다른 글
컬렉션 프레임워크 - ArrayList 복습, 개념정리(자바의정석) (0) | 2023.08.20 |
---|---|
소켓프로그램 (ip출력해서 서버와 클라이언트 단방향 통신하기) (0) | 2023.06.27 |
throws Exception 예외처리, simpleDateFormat (0) | 2023.06.23 |
collection (컬렉션 프레임워크) List, Set, Map / 컬렉션의 제네릭타입 (0) | 2023.06.22 |
람다식 , 최상위클래스 Object (0) | 2023.06.07 |