다음은 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 에게 실행을 맡긴다.
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)
스레드의 생성자이다
여러 분야에서 동기화 라는 표현이 많이 쓰인다.
하지만 유사하게 언급된다 해서 같거나 비슷한 개념이라 생각하지말자
은행얘기
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 이하로도 내려가는 문제가 생긴다.
이를 해결하기위해 동기화를 활용
여기서 밸런스는 동시에 접근하면 문제가 생기는
임계영역이라 한다.
동시에 접근하지못하고 순차적으로 접속하게 하는것이 동기화이다
무었이든 입출력하는 대상과 자바 프로그램은
읽어들이고 내보내는 연결이 있다.
이를 입력/출력 스트림 이라고한다.