프로세스는 운영 체제에서 실행중인 프로그램
프로그램의 코드, 데이터, 메모리 등 자원을 관리
스레드는 프로세스 내에서 실행되는 작업의 흐름을 나타냄
한 프로세스는 여러 스레드를 가질 수 있음 → 여러 작업을 병렬로 수행 가능
스레드는
다수의 클라이언트로부터 다수의 요청을 처리해야 하는 서버,
여러 작업을 동시에 처리해야 하는 실시간 시스템(채팅, 로봇, 항공기 제어 등)
등에 사용됩니다.
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 = {"&", ":", "?","/","\"","|","*"};
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 |