-
728x90
상속으로 쓰레드 구현
class th01_1 extends Thread{public void run(){for(int i=0;i<1000;i++){System.out.println("TH01_1: "+i);}}}th01_1 t1 = new th01_1();t1.start();인터페이스로 쓰레드 구현
class th01_2 implements Runnable{public void run(){for(int i=0;i<1000;i++){System.out.println("TH01_2: "+i);}}}Runnable r = new th01_2();Thread t2=new Thread(r);t2.start();전체 코드
public class th01 {public static void main(String[] args) {th01_1 t1 = new th01_1();t1.start();
Runnable r = new th01_2();Thread t2=new Thread(r);t2.start();
for(int i=0;i<1000;i++){System.out.println("main: "+i);}}}class th01_1 extends Thread{public void run(){for(int i=0;i<1000;i++){System.out.println("TH01_1: "+i);}}}class th01_2 implements Runnable{public void run(){for(int i=0;i<1000;i++){System.out.println("TH01_2: "+i);}}}JVM이 쓰레드한테 작업을 할당 할 때 운영체제에게 맡기는 것에 따라 수행이 달라짐
쓰레드에서 따로 공간을 만들어 run을 호출한다.
public class th02 {public static void main(String[] args) {th02_1 t1 = new th02_1();t1.start();
}}class th02_1 extends Thread{public void run(){try{throw new Exception();}catch(Exception e){throw new RuntimeException(e);}}}쓰레드는 동시에 수행할 수 있어보여, 작업이 빠를것 같지만 실제로는 작업이 동시에 수행되는 것이 아니라 느리다.
쓰레드는 작업을 번갈아 가며 수행한다.
쓰레드 사용 vs 사용하지 않을 때
쓰레드x
public class th03 {public static void main(String[] args) {long start=System.currentTimeMillis();
for(int i=0;i<1000;i++){System.out.printf("%S ","-");}System.out.println("소요시간1: "+(System.currentTimeMillis()-start));for(int i=0;i<1000;i++){System.out.printf("%s","|");}System.out.println("소요시간2: "+(System.currentTimeMillis()-start));}}쓰레드 사용public class th04 {static long start=0;public static void main(String[] args) {start=System.currentTimeMillis();th04_1 t1=new th04_1();t1.start();
for(int i=0;i<1000;i++){System.out.printf("%s","|");}System.out.println("소요시간2: "+(System.currentTimeMillis()-th04.start));}}
class th04_1 extends Thread{public void run(){for(int i=0;i<1000;i++){System.out.printf("%S ","-");}System.out.println("소요시간1: "+(System.currentTimeMillis()-th04.start));}}왔다갔다 많이 할수록 느려짐
Runnable로 만들경우 thread를 여러 개 만들 수 있음동시성 제어 필요
public class th05 {public static void main(String[] args) {Account account=new Account();for(int i=0;i<10;i++){Thread deposit= new Thread(new DepositThread(account));Thread withdraw= new Thread(new WithdrawThread(account));deposit.start();withdraw.start();}}}class Account{static long balance=1000;public void deposit(long amount){balance=balance+amount;}public void withdraw(long amount){balance=balance-amount;}public void getBalance(){System.out.println("balance: "+balance);}}class DepositThread implements Runnable{Account account;DepositThread(Account account){this.account=account;}public void run(){for(int i=0;i<1000;i++){account.deposit(1000);}account.getBalance();}}class WithdrawThread implements Runnable{Account account;WithdrawThread(Account account){this.account=account;}public void run(){for(int i=0;i<1000;i++){account.withdraw(1000);}account.getBalance();}}동시성 제어가 중요함
쓰레드를 사용할 때 동시성 제어가 제대로 되지 않으면 이상한 값이 나올 수 있음
static을 쓰면 공통 결합도가 생겨 좋지않아 사용하는 것을 권장하지 않는다.
synchronized를 추가하여 동시성 제어를 할 수 있다.
class Account{static long balance=10000;public synchronized void deposit(long amount){balance=balance+amount;}public synchronized void withdraw(long amount){balance=balance-amount;}public void getBalance(){System.out.println("balance: "+balance);}}728x90반응형'공부' 카테고리의 다른 글
서버 클라이언트 통신 (0) 2022.07.27 디자인 패턴 - 싱글톤 (0) 2022.07.27 네트워크 스트림 (0) 2022.07.26 자바 스트림 (0) 2022.07.26 자바 예외 처리 (0) 2022.07.26