ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 자바 쓰레드
    공부 2022. 7. 27. 10:38
    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

    댓글

Designed by Tistory.