멀티 스레드 Multi Thread
프로세스 : 실행중인 프로그램
프로그램 : 만들어졌는데 아직 실행되지 않고 하드디스크에 저장된 상태
스레드 : 프로세스를 실행시켜 준다.
main이 쓰레드다. main이 없으면 실행 안됨.
멀티쓰레드의 장/단점
- CPU사용률 향상
- 응답성 향상
- 자원 공유 -> 효율성 증대
- Context Switching 비용 발생
- 자바에서는 멀티스레드의 순서가 보장되지 않는다.
메소드 상태(cycle) - 5가지.
running 이후 할당된 시간이 끝나면 다시 runnable 상태로 대기줄에 서게된다.
- new => runnable 로 갈때 꼭! start() 라는 메소드를 호출해줘야 한다.
yield()
running에서 양보하라고 메소드를 호출할 수 있다.
runnable 대기큐를 체크해서 자기보다 우선순위가 높거나 같은애가 있다면 양보한다.
우선순위가 높은애가 없으면 양보하지않는다.
< Thread를 만드는 방법 두가지 >
- Runnable 인터페이스 구현
xxxxxxxxxx
public interface Runnable{
public abstract void run();
}
- thread 클래스 상속
public class Thread implements Runnable{
...
}
xxxxxxxxxx
class MyThread extends Tread{
public void run(){
~~~
}
}
Thread t3 = new MyThread();
if ) 어떤 클래스에서 thread를 써야겠다.
-> 아무것도 상속받지 않은 상태라면 implements도 되고, 상속도 됨.
-> 어떤 클래스를 상속하고 있다면 implements만 가능
(공통) 쓰레드가 해야하는 작업내용이 들어있는 메소드를 만들어놔야한다.
x
package com.thread;
//Thread 클래스 상속받는 방법
class Tiger extends Thread{
//callback method : 사용자에 의해 직접 호출되지 않지만 특정 조건이 되면 자동 실행되는 메소드
//thread가 수행해야 할 작업 내용을 갖는 메소드
public void run() {
System.out.println("thread is running!" + getName());
}
}
public class TigerTest {
public static void main(String[] args) {
Tiger t1= new Tiger(); //t1은 thread다
t1.start(); //thread에게 작업 시작을 알리는 메소드
/*
* 직접적으로 run을 호출하지 않는다.
* start를 호출하면 알아서 run을 찾아간다.
* */
//t1.run();
Tiger t2= new Tiger(); //t1은 thread다
t2.start();
Tiger t3= new Tiger(); //t1은 thread다
t3.start();
Tiger t4= new Tiger(); //t1은 thread다
t4.start();
}
}
/**
*t1.start()
*main thread가 start() 만 수행하고 (스레드 시작 버튼 )
*run은 tiger thread가 수행.
*
*t1.run()
*main이 run을 수행.
*==> context switching
*
*/
callback method
xxxxxxxxxx
main(){
first();
}
first(){
second();
}
second(){ //callback method
~~~~
}
x
package com.thread;
//Runnable을 구현하는 방법
//thread가 수행해야 할 작업 내용을 갖는 메소드
class Lion implements Runnable{
//Lion 은 Runnable 타입(종류)다.
//하지만, thread는 아니다.
public void run() {
System.out.println("Thread is running..."+Thread.currentThread().getName());
}
}
public class LionTest {
public static void main(String[] args) {
Lion l1 = new Lion(); // thread는 아니다.
//대신 Runnable 객체. thread가 수행해야 하는 작업 메소드 run()은 가지고 있음.
Thread t1 = new Thread(l1); //l1의 run()을 실행하러감.
t1.start();
Thread t2 = new Thread(l1); //l1의 run()을 실행하러감.
t2.start();
Thread t3 = new Thread(l1); //l1의 run()을 실행하러감.
t3.start();
}
}
<실행결과>
xxxxxxxxxx
Thread is running...Thread-0
Thread is running...Thread-2
Thread is running...Thread-1
Thread객체 생성시 parameter로 Runnable 타입의 객체를 받을 수 있다.
- main에서 m 생성
- 생성자로 들어가서 thread t 생성
- t.join (); //Waits for this thread to die
- main이 t스레드가 끝날때까지 기다려줌
main thread 실행
**) main thread가 우선순위가 더 높기때문에 default상태로는 먼저 실행
package com.thread;
public class MainThreadTest implements Runnable {
MainThreadTest() {
//thread를 생성하고, start
Thread t = new Thread(this);
t.start();
try {
t.join(); //t를 기다려줌 (main이)
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
MainThreadTest m = new MainThreadTest();
m.go();
}
public void go() {
System.out.println("gogo");
}
public void run() {
System.out.println("run by thread..");
}
}
'Computer Science > Languages' 카테고리의 다른 글
[java 예외처리]Try-with-resources (2) | 2019.07.11 |
---|---|
java tip (0) | 2019.02.18 |
[java] 예외처리 (2) | 2019.01.24 |
[java] Collection 활용 (0) | 2019.01.17 |
[java] interface (0) | 2019.01.16 |