java 221118

John·2022년 11월 18일
0

java

목록 보기
15/20

thread

다음은 0 / 1을 300번 입력하는 클래스 두개이다.

public class ThreadTest_01 {
    public static void main(String[] args) {
        MyThread1 th1 = new MyThread1();
        MyThread2 th2 = new MyThread2();
//
        th1.start();//jvm 이 os 에게
        th2.start();//쓰레드  두개 달라고 앙망 하는것
    }   //start 로 해야 os 에게 맡기는거임
}
class MyThread1 extends Thread{
    public void run(){
        for (int i = 0; i < 300; i++) {
            System.out.print("0");
        }
    } //run
}
class MyThread2 extends Thread{
    public void run(){
        for (int i = 0; i < 300; i++) {
            System.out.print("1");
        }
    } //run
}
  • run : 기존의 main 이라고 생각하자.
  • start : jvm 이 os 에게 실행을 맡긴다.

runable

        Thread_CntD th1 = new Thread_CntD();
        th1.start();
        class Thread_CntD extends Thread {...}

위와 아래는 기본적으로 같다

        Thread th = new Thread(new Thread_CntD());
        th.start();
        class Thread_CntD implements Runnable {...}
Thread(String name)

스레드의 생성자이다

Thread의 동기화 - synchronized

여러 분야에서 동기화 라는 표현이 많이 쓰인다.
하지만 유사하게 언급된다 해서 같거나 비슷한 개념이라 생각하지말자

은행얘기

public class Example_01 {
    public static void main(String[] args) {
        Runnable r = new RunnableEx22();
        new Thread(r).start();
        new Thread(r).start();
    }
}
class Account2{
    private  int balance = 1000; //계좌에 1000 있다
    public int getBalance(){
        return balance;
    }
    public void withdraw(int money){
        if (balance >= balance) {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e){}
            balance -= money;
        }
    }//withdraw
}
class RunnableEx22 implements Runnable{
    Account2 acc =new Account2();
    public void run(){
        while (acc.getBalance() > 0){
            //100,200,300 중 선택해 출금
            int money= (int) (Math.random() * 3 + 1)*100;
            acc.withdraw(money);
            System.out.println("balance:"+acc.getBalance());
        }
    }
}

같은 계좌에 동시접속하게 atm 두개로 테스트한다.
그때 스레드를 사용한다.
위가 그 코드이다

스레드개 두개이니 편의상 a b 로 말하면
a 체크
a 멈춤
b 체크
b 멈춤
a 인출
b 인출
의 순서로 이뤄진다.

하나의 밸런스에 두개의 스레드가 동시에 접근하기때문에
0 이하로도 내려가는 문제가 생긴다.
이를 해결하기위해 동기화를 활용

여기서 밸런스는 동시에 접근하면 문제가 생기는
임계영역이라 한다.

동시에 접근하지못하고 순차적으로 접속하게 하는것이 동기화이다

I/O MODEL , Stream

무었이든 입출력하는 대상과 자바 프로그램은
읽어들이고 내보내는 연결이 있다.

이를 입력/출력 스트림 이라고한다.

profile
hello there

0개의 댓글