쓰레드(Thread) 미니 프로젝트

기록하는 용도·2022년 9월 4일
0

쓰레드(Thread) 미니 프로젝트



요구사항

파일생성 스레드

MakeFileWorker Thread

  • repository 디렉토리에 일정한 간격으로 avi 확장자의 동영상 파일과 mp3 확장자의 음악 파일을 생성한다. (MakeFileWorker 스레드를 정의해 실행한다)(1초 간격으로 30번 실행한다)
  • mp3 와 avi 확장자는 랜덤하게 만들어져야 한다 .
  • 파일명은 0~29번까지 매번 실행할 때마다 그 범위안에서 순차적으로 이름이 지어져야 한다 .
    예 ) 0_1661484144987.avi 또는 0_1661484144987.mp3
  • 파일명이 중복될 수 있으므로 시간정보를 중간에 삽입한다.


step1. 업무파악

step2. 확장자를 랜덤하게 할당

java.util.Random 

step3. 파일명에 시간정보를 배당

System.currentTimeMills(); 

step4. 디렉토리와 파일생성

java.io.File  mkdirs()   ,  createNewFile();

파일이동 스레드

MoveFileWorker Thread

  • 동시에 repository 디렉토리에 생성된 파일을 일정 주기동안 반복하면서 확장자별로 avi 동영상 파일은 movie 디렉토리로 이동시킨다.
  • mp3 음악 파일은 music 디렉토리로 분류해서 파일을 이동시킨다.( 7초 간격으로 5번 실행한다 )


step5. 파일 이동

java.io.File renameTo() 

step6. 디렉토리 내의 파일리스트 정보 -> 확장자별 분류

java.io.File listFiles() 



1. 파일생성 스레드

  1. MakeFileWorker class를 만들고 Runnable을 implements한다.
  2. 1초 간격으로 파일을 30번 생성하기때문에 생성자로 makeCount와 makePeriod를 선언한다.
  3. makeDir() 메소드와 makeFile() 메소드를 분리해 코드를 구현한다. (파일을 삽입할 경로의 디렉토리가 존재하면 makeFile() 메소드를 실행하고, 그렇지 않다면 생성 후 makeFile() 메소드를 실행할 수 있도록 구현한다.
  1. makeDir()
public void makeDir(){
	File fileDir = new File(Path.MAKE_PATH);
	if(fileDir.isDirectory()==false) {
		fileDir.mkdirs();
	}
}
  1. makeFile()
    ㄱ. 파일명은 0_1662204788261.mp3 처럼 파일명이 겹치지않도록 파일명의 맨앞에 0부터 29까지 수를 달아주고, 시간 정보(파일 생성시간)을 이용해 구분할 것이다.
    ㄴ. 파일 생성시간을 위한 메소드는 System.currentTimeMillis()가 있다. 이 메소드는 반환되는 타입이 long 형으로, 시간데이터인 세계 표준시 기준으로 몇 밀리세컨드가 흘렀는 지 기록된 값을 출력할 수 있도록 이 메소드를 사용할 것이다.
System.out.println(System.currentTimeMillis());

1662204788260
1662204788261

결과는 이러하다. 우리가 파일명으로 이 시간 정보를 이용할 수 있다.

public void makeFile() throws IOException, InterruptedException {
	Random random = new Random();
		
	for (int i = 0; i < makeCount; i++) {
		Thread.sleep(makePeriod);
		String fileName = null;
		long time = System.currentTimeMillis();
		fileName = i + "_" + time + "_";
		if (random.nextBoolean())// true이면{
			fileName += ".mp3";
		else {
			fileName += ".avi";
		}
		newFile = new File(fileDir+File.separator + fileName);
		System.out.println(fileName);
		newFile.createNewFile();
	}
}

for문은 1초 간격으로 실행되게하였고, 30번 fileName을 새로 만들게 하였다.
i에 System.currentTimeMillis()로 시간 정보를 더하고 random.nextBoolean() 메소드를 이용해 두가지 경우를 만들어 mp3와 avi로 분류해 또 이름에 더할 수 있게 하였다.

그리고 그 이름을 사용하여 파일 객체를 생성해 경로를 생성하고, createNewFile()을 통해 파일을 1초 간격으로 생성할 수 있게 하였다.(예외처리는 throw해주었다)

*참고

Random random=new Random();
System.out.println(random.nextBoolean());
System.out.println(random.nextBoolean());
System.out.println(random.nextBoolean());
if(random.nextBoolean()){
	ext=".mp3";
	String fileName="test"+ext;
    System.out.println(fileName);
}




true
false
true
test.avi
false



random.nextBoolean()은 두가지경우인 true, 혹은 false를 반환한다.



2. 파일이동 스레드

  1. MoveFileWorker class를 만들고 Runnable을 implements한다.
  2. 디렉토리 생성을 위한 makeDirs() 메소드를 만든다.
  3. 7초 간격으로 5번 이동시키기 위해 for loop를 이용해 moveFiles() 메소드를 만든다.
  1. makeDirs()
	public void makeDirs() {

		if (movieFileDir.isDirectory() == false) {
			movieFileDir.mkdirs();
		}
		if (musicFileDir.isDirectory() == false) {
			musicFileDir.mkdirs();
		}
	}

파일을 분류하기위해 미리 경로에 해당하는 디렉토리가 있는지 확인하는 메소드를 만든다.

2.moveFiles()

File[] files = fileDir.listFiles();
	File moveFile = null;
	File destFile = null;

	for (int i = 0; i < files.length; i++) {
		moveFile = new File(Path.MAKE_PATH + File.separator + files[i].getName());

		if (files[i].getName().endsWith(".mp3")) {
			System.out.println("mp3");
			destFile = new File(Path.MUSIC_PATH + File.separator + files[i].getName());
			moveFile.renameTo(destFile);

			System.out.println(destFile);
		} else {
			destFile = new File(Path.MOVIE_PATH + File.separator + files[i].getName());
			moveFile.renameTo(destFile);

			System.out.println(destFile);
		}
	}
File[] files = fileDir.listFiles();

listFiles()메소드로 파일을 반환하는 참조 변수를 선언했다.
이 코드로 해당 경로의 파일들이 리스트 형식으로 files라는 변수에 반환되는 것이다.

for (int i = 0; i < files.length; i++) {
		moveFile = new File(Path.MAKE_PATH + File.separator + files[i].getName());

for문으로 반환한 files의 길이 만큼 돌면서 moveFile이라는 변수에 file이름을 갖는 새로운 파일 객체를 생성한다.

if (files[i].getName().endsWith(".mp3")) {
			System.out.println("mp3");
			destFile = new File(Path.MUSIC_PATH + File.separator + files[i].getName());
			moveFile.renameTo(destFile);

			System.out.println(destFile);
		} else {
			destFile = new File(Path.MOVIE_PATH + File.separator + files[i].getName());
			moveFile.renameTo(destFile);

			System.out.println(destFile);
		}

파일이름이 .mp3로 끝나는지 .avi로 끝나는지 확인하며 해당 경로에 이동할 수 있도록한다.

  1. run()
public void run() {
		makeDirs();//디렉토리 생성을 위해 호출 
		
		for(int i=0;i<moveCount;i++) {
			try {
				Thread.sleep(movePeriod);
				moveFiles();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			//디렉토리 내의 파일을 이동시키기 위해 호출 
			System.out.println("MoveFileWorker Thread가 파일들을 이동");
		}
	}

7초 간격으로 5번 이동시키기 위해 for loop를 이용한다.

3. 메인 클래스

public class TestThreadMiniProject {
	public static void main(String[] args) {
		int makeCount=30;//파일 생성수 30번 
		int makePeriod=1000;//생성 주기 1초간격 
		MakeFileWorker makerWorker
		=new MakeFileWorker(makeCount,makePeriod);
		Thread thread  = new Thread(makerWorker);
		thread.start();
		// 스레드 생성 후 start 시킨다 
		
		int moveCount=5;
		int movePeriod=7000;
		MoveFileWorker moveFileWorker =new MoveFileWorker(moveCount,movePeriod);
		Thread thread2 = new Thread(moveFileWorker);
		thread2.start();
	}
}

0개의 댓글