20180810
- Thread
-> 프로세스
-> 실행중인프로그램
-> OS으로부터 실제 메모리를 할당받아 실행중인 상태
-> 프로그램 실행하는데에 필요한 데이터 + 메모리 + 쓰레드
3개가 합쳐져 있다.
# 쓰레드
-> 프로세스가 일을처리하는 최소 작업단위
-> (간단하게) 실행의 흐름단위
-> cpu가 실행을 요청순서에 따라서 순서결정
-> FIFO 구조이다. (First In First Out)
-> 쓰레드가 1개 있다는것(싱글 쓰레드)
-> 한번에 하나의 작업만 가능(메세지를 보내거나 기다리거나)
-> 멀티스레드로 만들경우 여러가지일을 다중적으로 처리할 수 있다.
멀티쓰레드(쓰레드가 여러개)
-> 동시에 여러가지 작업이 가능
-> CPU사용률을 향상
-> 자원을 보다 효율적으로 사용함
-> 사용자에 대한 응답성이 향상 (동시에 메세지를 주고받을수 있다.)
-> 코드 분리가능(읽어오는 코드, 쓰는 코드)
멀티쓰레드 주의사항
-> 동기화, 교착상태
동기화 -> 독립적인 2개이상의 개체를 연결 -> 1:N관계
교착상태 -> 두 쓰레드가 자원을 점유한 상태에서 상대편이 점유한 자원을 사용하려고 기다리느
라 진행이 멈춰 있는 상태 -> 1:1관계
그동안 한개의 쓰레드로 계속 실행
-> 실행클래스 -> main() -> main쓰레드
멀티스레드하는경우 작성
1. Thread 클래스 상속 받아야 한다. -> 자바에서는 상속이 하나밖에 안되었다.
-> Runnalbe라는 인터페이스를 상속하면 된다.
(상속이 되있는 클래스라고 하면 Runnable 인터페이스를 상속받으면 된다.
2. run()메소드를 오버라이딩 해야된다.
-> 실행에 필요한 코드를 작성하면 된다.
Thread를 상속받으면 run()메소드를 @Override해야한다.
===========================================================
먼저 들어온걸 동기화라고 한다.(synchronized )
객체가 하나이고 쓰레드가 접속을 둘이 해서 둘다 쓸려고 해서 그런다.
동기화를 쓸경우 하나가 끝날때까지 기다린후 그후 다음께 실행된다. 같이실행이안된다.
----------------------------------------------------------------------------------------------------
StringBuffer
-> 쓰레드세이프 지원
StringBuilder
-> 쓰레드 세이프 지원하지 않는다.
쓰레드 safe = 쓰레드 synchronized 이거다.
쓰레드 버퍼로 만들어진 녀석은 lock를 가질수 있는데 이거있는 사람한테만 쓰게 할꺼야
StringBuilder은 lock를 가질수없어서 synchronized를 쓸 수 없다.
package jongkyu.start;
public class Start {
public static void main(String[] args) {
// Test1 t1 = new Test1(); //Thread 상속
// Test2 t2 = new Test2(); //Runnable 상속
// //쓰고싶은 멀티쓰레드 객체를 만들었다.
// Thread th1 = t1; //Thread 상속의 경우 생략 가능
// //Thread th2 = t2; //이렇게 해버리면 안된다. -> Thread th1은 t1을 상속받았다. 다형성이 적용되어있다. th1은 부모 t1은자식클래스이다.
// //얘는 상속받은 녀석이 아니기 때문에 사용을 할려면
// Thread th2 = new Thread(t2);//->이렇게 써줘야 한다.
// th1.setPriority(10);//1~10사이의 숫자 넣어주면 된다.//10이우선순위가높다.
// th2.setPriority(1);//우선순위가 낮다.
// //Priority는 가중치이다.
// th1.start();
// th2.start(); //쓰레드의 호출을 할때는 쓰레드를 호출해야한다.
// //여기까지면 쓰레드를 3개쓰는것이다. 우리가 작성한거 2개랑 main까지 하는것이다.
// try {
// //th1.join();//join의 의미는 th1이라는 쓰레드가 종료될때까지 기다린다.
// th2.join(3000);//기다리는데 3초만기다리고 실행할꺼야..
// //아무것도 안넣으면 끝날때까지고 넣으면 그 시간만큼만 기다린다.
// //th1.interrupt(); //인터럽트는 쓰레드를 강제로 중지시킬때 사용
// System.out.println("메인쓰레드 실행테스트");
// } catch (InterruptedException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
//System.out.println("=====================================");
Table t = new Table();
//밑에 Table을 통해 t라는 걸 만들었다.
MyThread1 t1 = new MyThread1(t);
MyThread2 t2 = new MyThread2(t);
//이렇게 하면 main에서 Table객체를 만들었고
//만들어지고나서 쓰레드2개를 만들려고 쓴것인데
//각각 같은 녀석을 참조하고 있다.
t1.start();
t2.start();//쓰레드를 상속한경우일반 객체만들듯이 쓰면 된다.
//start라는 녀석은 주소값을 찾아가고 거기에 있는 dataPrint메소드를쓸거야
//결론적으로는 Table라는 t의 객체가 똑같다.
}
}
class Table{
public synchronized void dataPrint(int n) {
//synchronized를 쓸경우 하나가 끝날때까지 접속이 안된다는 것이다.
for(int i=1; i<=5; i++) {
System.out.println(n+"X"+i+"="+n*i);//매개변수 받아서 1부터 9까지 곱하는것
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}//0.5초이다.
}
}
}
class MyThread1 extends Thread{
Table t;
public MyThread1(Table t) {
this.t = t;
}
public void run() {
t.dataPrint(5);
}
}
class MyThread2 extends Thread{
Table t;
public MyThread2(Table t) {
this.t = t;
}//생성자
public void run() {
t.dataPrint(100);
}
}
'IT일반과목 > java' 카테고리의 다른 글
자바 네트워크 TCP통신 문제 맞추기 (0) | 2018.08.12 |
---|---|
자바 네트워크 다중접속 과제 (2) | 2018.08.12 |
쓰레드1 (학원수업) (0) | 2018.08.10 |
네트워크 수업3 (야구게임) (과제) (0) | 2018.08.09 |
네트워크 수업2 (0) | 2018.08.09 |