Multi Thread
1개의 응용프로그램이 스레드로 불리는 처리 단위를 복수 생성하여 복수의 처리를 병행하는 것을 의미합니다.
기본적으로 아래의 소스는 1개 응용프로그램의 1개의 스레드가 작업을 수행하는 것을 의미합니다.
$ cat Main.java public class Main { public static void main(String args[]) throws Exception { System.out.println("This is One Thread Program"); } }
그렇다면 Thread 를 구현하는 방법은 어떻게 되는지 알아보려고 합니다.
1. Thread 클래스를 상속받아 구현
2. Runnable 인터페이스를 구현
이번 포스팅에서는 1번 방법에 대한 코드 기반으로 알아보려고 합니다.
2번 코드는 포스터의 가장 하단에 작성하겠습니다.
먼저 하나의 Thread 를 생성하는 방법입니다.
Step 1. Main 클래스에서 한개의 MultiThread 객체를 생성합니다. ( 굳이 배열을 넣은 이유는 멀티쓰레드에서 설명하기 쉽게 하기 위해서 입니다. )
Step 2. 생성한 MultiThread 객체의 쓰레드를 실행합니다. 이 때 실행을 위해서는 start 라는 함수를 사용해야 합니다.
Step 3. start 라는 함수가 호출되면 MultiThread 클래스의 run 함수가 수행됩니다.
$ cat Main.java public class Main { public static void main(String args[]) throws Exception { MultiThread[] mt = new MultiThread[1]; mt[0] = new MultiThread(); mt[0].start(); } } class MultiThread extends Thread { MultiThread(){ } public void run(){ try{ /* Source */ }catch(Exception e){ e.printStackTrace(); } } }
이제 위 소스를 기반으로 다수개의 Thread 를 생성하는 방법입니다.
Step 1. Main 클래스에서 한개 이상의 MultiThread 객체를 생성합니다.
Step 2. 생성한 MultiThread 객체들 별로 쓰레드를 수행합니다.
$ cat Main.java public class Main { public static void main(String args[]) throws Exception { MultiThread[] mt = new MultiThread[3]; for(int i = 0 ; i < 3 ; i ++){ mt[i] = new MultiThread(); mt[i].start(); } } } class MultiThread extends Thread { MultiThread(){ } public void run(){ try{ /* Source */ }catch(Exception e){ e.printStackTrace(); } } }
다수개의 Thread 일 때, 공유되는 객체의 문제점 해결하는 방법입니다.
한개의 Thread 일 때는 문제가 발생하지 않지만 다수의 Thread 일 때는, 공유되는 객체에 대한 데이터 처리로 문제가 발생할 수 있습니다.
이 때에는, synchronized 함수를 통해 데이터 처리가 하나의 스레드에서만 발생되도록 락을 걸 수 있습니다.
$ cat Main.java public class Main { public static void main(String args[]) throws Exception { System.out.println("This is One Thread Program"); MultiThread[] mt = new MultiThread[3]; for(int i = 0 ; i < 3 ; i ++){ mt[i] = new MultiThread(); mt[i].start(); } } } class MultiThread extends Thread { Mozi mz = new Mozi(); MultiThread(){ } public void run(){ try{ int money = 0; mz.tistory(money); }catch(Exception e){ e.printStackTrace(); } } } class Mozi { public synchronized void tistory(int money){ /* Source */ } }
쓰레드 상태를 제어할 수 있는 함수도 제공됩니다.
제가 가장 많이 사용하는 쓰레드 함수입니다.
Thread.sleep
주어진 시간동안 스레드 수행이 중단됩니다.
Thread.join
다른 스레드의 작업이 종료될 때까지, 다음 작업을 중단합니다.
$ cat Main.java public class Main { public static void main(String args[]) throws Exception { System.out.println("This is One Thread Program"); MultiThread[] mt = new MultiThread[3]; for(int i = 0 ; i < 3 ; i ++){ mt[i] = new MultiThread(); mt[i].start(); } for(int i = 0; i < 3; i ++){ mt[i].sleep(5); mt[i].join(); } } } class MultiThread extends Thread { MultiThread(){ } public void run(){ try{ }catch(Exception e){ e.printStackTrace(); } } }
Runnable 로 멀티쓰레드를 구현하는 방법입니다.
public class Main { public static void main(String args[]) throws Exception { System.out.println("This is One Thread Program"); Runnable r = new MultiThread(); Thread[] t = new Thread[3]; for ( int i = 0; i < 3; i++){ t[i] = new Thread(r); t[i].start(); } } } class MultiThread implements Runnable { public void run(){ System.out.println(1); } }
코드상에 문제가 있는 경우, 지적해주시면 의견토론 후 반영하도록 하겠습니다.
'Computer Language > JAVA' 카테고리의 다른 글
[JAVA] 오버로딩, 오버라이딩 개념 및 차이점 파악하기 (0) | 2018.07.10 |
---|---|
[JAVA] currentTimeMillis, nanoTime 소스 수행 시간 차이 계산하기 (0) | 2018.06.28 |
[JAVA] JSON 형식의 파일 읽어오기 (0) | 2018.06.27 |
[JAVA] PreparedStatement 와 Statement 차이점 알아보기 (0) | 2018.01.26 |
[JAVA] Execute, ExecuteQuery, ExecuteUpdate 차이점 알아보기 (3) | 2018.01.23 |