자바

스레드. 배치파일

chantleman 2024. 8. 6. 10:12

프로세스는 운영  체제에서 실행중인 프로그램

               프로그램의 코드, 데이터, 메모리 등 자원을 관리

 

스레드는 프로세스 내에서 실행되는 작업의 흐름을 나타냄

           한 프로세스는 여러 스레드를 가질 수 있음 → 여러 작업을 병렬로 수행 가능

 

 

스레드는

다수의 클라이언트로부터 다수의 요청을 처리해야 하는  서버,

여러 작업을 동시에 처리해야 하는 실시간 시스템(채팅, 로봇, 항공기 제어 등)

등에 사용됩니다.

 

 

 


 

 

 

ctrl + alt + del

작업관리자 → 자세히 

 

백그라운드 프로세스에서 실행중인 프로그램을 확인할 수 있는데

 

 

cpu의 코어는 프로세스가 실행하는 명령어들을 처리하는 역할을 합니다.

각 코어는 명령어를 읽고 해석하며 계산을 수행하고 결과를 저장하는 등의 작업을 수행합니다.

 

코어는 하나의 일밖에 처리하지 못하지만, 스케줄링을 통해 여러개의 작업을 병렬로 처리하는데 그것을  하이퍼 스레딩이라고 합니다.

 

 

 

 

 

 

스레드 상속받는 법

extends Thread 혹은 implements Runnable

 

 


<스레드 이용해서 채팅 만들기>

 

 

1. DB 테이블 생성

 

 

 

2. chatDao

<hide/>
	public class ChatDao {

        private static ChatDao instance;
        private ChatDao() {
        }

        public static ChatDao getInstance() {
            if (instance == null) {
                instance = new ChatDao();
            }
            return instance;
        }

        JDBCUtil jdbc = JDBCUtil.getInstance();

        public void sendMessage(List<Object> param) {
            //insert
            String sql="insert into chat(user1, user2, message, reception)\r\n"
                    + "values(?,?,?,'1')";
            jdbc.update(sql,param);
        }

        public List<Map<String,Object>> receiveMessage(List<Object> param){
            //select		
            String sql="select * from chat \r\n"
                    + "where user2=?\r\n"
                    + "and reception='1'";		
            return jdbc.selectList(sql,param);
        }

        public void updateReceive(List<Object> param) {
            //update		
            String sql="update chat\r\n"
                    + "set reception='0'\r\n"
                    + "where user2=?";	
            jdbc.update(sql,param);
        }
    }

 

 

 

 

2. chatService

    <hide/>
    public class ChatService {
        private static ChatService instance;

        private ChatService() {

        }

        public static ChatService getInstance() {
            if (instance == null) {
                instance = new ChatService();
            }
            return instance;
        }

        ChatDao dao = ChatDao.getInstance();

        public void sendMessage(List<Object> param) {
            dao.sendMessage(param);
        }

        public List<Map<String,Object>> receiveMessage(List<Object> param){
            return dao.receiveMessage(param);

        }
        public void updateReceive(List<Object> param) {
            dao.updateReceive(param);
        }
    }

 

 

 

4. chatJob

    <hide/>
    public class ChatJob extends Thread{

        String user;
        public ChatJob(String user) {
            this.user=user;
        }

        ChatService chat = ChatService.getInstance();

        @Override
        public void run() {
            while(true)
            {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                List<Object> param = new ArrayList();
                param.add(user);

                List<Map<String,Object>> list = chat.receiveMessage(param);
                if(list == null) continue;
                for(Map<String,Object> map :list)
                {
                    System.out.println("보낸 사람: "+ map.get("USER1"));
                    System.out.println("메시지: "+ map.get("MESSAGE"));
                    System.out.println("받는 사람: "+ map.get("USER2"));
                    System.out.println("읽음: "+ map.get("RECEPTION"));
                }
                chat.updateReceive(param);
            }	
        }	
    }

 

 

 

5. chatMain

    <hide/>

    public class ChatMain {
        public static void main(String[] args) {

            ChatService chatService = ChatService.getInstance();
            String user= ScanUtil.nextLine("유저 아이디: ");

            ChatJob chat = new ChatJob(user);
            chat.start();

            while(true)
            {
                System.out.println("0 입력시 종료");
                String sendUser = ScanUtil.nextLine("발신자: ");
                String message = ScanUtil.nextLine("메시지: ");

                if(sendUser.equals("0")) break;

                List<Object> param = new ArrayList();
                param.add(user);
                param.add(sendUser);
                param.add(message);
                chatService.sendMessage(param);

            }

        }
    }

 



 


 

 

 

 

ip바꿔주면 다른 사람과 채팅 가능

(상대방 DB로 데이터가 들어감)

 

 

 

 

 

 

 

 


< cmd 로 실행하기 >

 

1. jar파일 생성

 

Main파일 우클릭 export

 

 

 

Runnable JAR file 클릭

 

 

 

 

경로 지정 후 Launch configuration 에서 main 파일 체크,

Extract required libraries into generated JAR 체크 후 finish

 

 

 

 

2. 폴더 생성된 것 확인

 

 

 

 

3. cd 폴더경로 입력 후 (저는 D드라이브로 다시 옮겼습니다.)

 

java -jar chat .jar  (jar 파일 이름)

 

 


 

 

< 배치 파일로 실행하기 >

 

메모장에 아래와 같은 양식으로 기입

 

@echo on

title 폴더 이름

명령어

pause

 

 

파일 저장할 때

확장자를 bat로 하고 폴더에 저장

 

 


멀티 스레드 사용하기

 

	ExecutorService exe = Executors.newFixedThreadPool(16);
	exe.execute(new ThreadJob(href, file));

 

 

멀티 스레드로 하면 빨리 데이터 가져올 수 있음

public class Step4Listpage_Thread {
	public static void main(String[] args) {
		Step4Listpage_Thread sl = new Step4Listpage_Thread();
		sl.process();
	}

	ExecutorService exe = Executors.newFixedThreadPool(16); 
	
	public void process() {
		File root = new File("yes24/step4");
		boolean chk = false;
		for (File bigMenu : root.listFiles()) {
			System.out.println("대메뉴 : " + bigMenu);
			if(bigMenu.getName().contains("자기계발")) continue;
			if(bigMenu.getName().contains("자연과학")) continue;
			if(bigMenu.getName().contains("잡지")) continue;
			if(bigMenu.getName().contains("전집")) continue;
			if(bigMenu.getName().contains("중등참고서")) continue;
			for (File middle : bigMenu.listFiles()) {
				System.out.println("\t중메뉴 : " + middle);
				for (File f : middle.listFiles()) {
					System.out.println("\t\t리스트 : " + f);
					String folder = f.getPath().replace("step4", "step5").replace(".html", "");
					File dir = new File(folder);
					if (!dir.exists())	dir.mkdirs();
					else continue;

					List<Map<String, String>> list = parser(f);
					for (Map<String, String> map : list) {
						String name = map.get("name");
						name = changeName(name);
						String href = map.get("href");
						File file = new File(dir, name + ".html");
						if (file.length() !=0 && file.exists()) continue;
						exe.execute(new ThreadJob(href, file));
					}
				}
			}
		}
	}
	
	public String changeName(String name) {
		String[] change = {"&amp;", ":", "?","/","\"","|","*"};
		for(String c : change) name = name.replace(c, "");
		return name;
	}

	public List<Map<String, String>> parser(File f) {
		List<Map<String, String>> list = new ArrayList();
		try {
			String html = Files.readString(Paths.get(f.getPath()));
			if ((html.equals(""))) {
				System.out.println("html 수집 에러");
			}
			String[] lines = html.split("\n");
			for (String line : lines) {
				if (line.contains("gd_nameF")) {
					String temp = line.split("</a>")[0];
					String href = temp.split("href=\"")[1].split("\"")[0];
					String name = temp.split(">")[3];
					Map<String, String> map = new HashMap();
					map.put("name", name);
					map.put("href", href);
					list.add(map);
				}
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
		return list;
	}
}
class ThreadJob extends Thread{
	
	String href;
	File file; 
	public ThreadJob(String href, File file) {
		this.href = href;
		this.file = file;
	}
	
	@Override
	public void run() {
		String url = JsoupUtil.rootUrl + href;
		try {
			String html ="";
			try {		
				html = JsoupUtil.getHtml(url);
			} catch (Exception e) {
			}
			if(html.equals("")) {
				html = JsoupUtil.getHtml(url);
			}
			Files.write(Paths.get(file.getPath()), html.getBytes());
			System.out.println("\t\t\t 파일 : "+file);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

'자바' 카테고리의 다른 글

maven  (0) 2024.08.09
톰캣 포트 변경하기  (0) 2024.08.07
mvc  (0) 2024.07.30
eclispe 상위 버전  (0) 2024.07.29
collection  (0) 2024.07.26