
Thread는 개념적으로는 프로세스 내에서 실행되는 흐름의 단위를 말한다. 멀티 프로세스에서 각 프로세스는 독립적으로 실행되며 각각 별개의 메모리를 차지하고 있는 것과 달리 멀티 스레드는 프로세스 내의 메모리를 공유해 사용할 수 있다.
운영체제 CS를 공부하면서 스레드, 멀티 스레드라는 것의 개념만 배우고 자바스크립트에서는 async(비동기)식으로 처리한 경험만 있지 서버 코드 상에서 스레드란 개념을 적용해본 경험은 없었다. 하지만 MySQL과 sqlite라는 두 개의 데이터베이스에서 성공 여부와 상관 없이 데이터를 저장하기 위해 스레드를 적용하여야 했다.
//ThreadA.java
public class ThreadA extends Thread {
int from;
int to;
String name;
public ThreadA(String name, int from, int to) {
this.name = name;
this.from = from;
this.to = to;
}
public void run() {
for (int i = from; i < to; i++) {
System.out.printf(" %s 's count %d \n", name, i);
}
System.out.println(name + " finished.");
}
}
//ThreadTest.java
public class ThreadTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
ThreadA t1 = new ThreadA("A", 1, 10);
ThreadA t2 = new ThreadA("B", 11, 20);
ThreadA t3 = new ThreadA("C", 21, 30);
t1.start();
t2.start();
t3.start();
}
}
// result
A 's count 1
A 's count 2
A 's count 3
A 's count 4
A 's count 5
A 's count 6
A 's count 7
A 's count 8
A 's count 9
C 's count 21
C 's count 22
C 's count 23
C 's count 24
C 's count 25
C 's count 26
C 's count 27
C 's count 28
C 's count 29
B 's count 11
B 's count 12
B 's count 13
B 's count 14
B 's count 15
B 's count 16
B 's count 17
B 's count 18
B 's count 19
C finished.
B finished.
A finished.
Thread 인터페이스를 구현한 ThreadA라는 클래스를 만들고 그 안에서 간단히 Thread가 어떻게 돌아가는지 확인할 수 있는 코드를 작성했다.
그리고 ThreadTest 클래스에서 start를 통해 각 객체를 시작하는데 이는 무조건 t1이 먼저 t3가 가장 나중에 끝남을 의미하지 않는다. 어떤 Thread가 runnable 한지를 start를 통해 운영체제에 알리면 자체적으로 Thread를 실행하기 때문이다. 이를 활용하면 Mysql과 sqlite 라는 각각 다른 DB에서 서로 영향을 받지 않으면서 안전하게 데이터를 다룰 수 있다.
//MyThread.java
public class MyThread extends Thread {
JSONObject json;
String url;
public MyThread(JSONObject json, String url) {
this.json = json;
this.url = url;
}
public void run() {
String method = "POST";
Map<String, String> headers = new LinkedHashMap<String, String>();
headers.put("Content-Type", "application/json");
try {
this.send(method, url, headers, json);
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
if(cmd.equalsIgnoreCase(CMDS.REGIST.toString().toLowerCase())) {
this.registOrder(req, res, json);
// MySQL 주문 등록 스레드
MyThread myThread = new MyThread(json, END_POINT_4_REGIST);
myThread.start();
}
위 코드는 Thread 개념을 실제 프로젝트에 적용한 코드의 일부이다.
기존에 sqlite에서만 저장되던 코드(this.registOrder)에서 thread 객체를 만들고 해당 객체를 runnable 상태로 만들어 MySQL에도 저장하도록 하여 두 데이터베이스를 독립적으로 다룰 수 있다.