ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 쓰레드(Thread)
    Java 2021. 12. 1. 14:45

    1. Thread 클래스 상속

    public class ThreadTest2 extends Thread{
    	// 스레드는 하나의 프로세스에서 다중 실행이 가능하다
    	// 1. Thread 상속
    	String msg;
    	public ThreadTest2() {}
    	public ThreadTest2(String msg) {
    		this.msg = msg;
    	}
    	
    	// 2. 스레드 구현을 하여야 기능은 run(오버라이딩) 메소드에 기술한다
    	public void run() {
    		//구현
    		for(int i=1; i<=100; i++) {
    			output(i);
    		}
    	}
    	
    	public void output(int i) {  // 호출한 메소드가 스레드 구현 내에 있으면 해당 메소드도 스레드됨
    		System.out.println(msg+"->"+i);
    	}
    	
    	
    	public static void main(String[] args) {
    		ThreadTest2 tt1 = new ThreadTest2("첫번째스레드");
    		ThreadTest2 tt2 = new ThreadTest2("두번째스레드");
    		ThreadTest2 tt3 = new ThreadTest2("세번째스레드");
    //		tt1.run();
    //		tt2.run();
    //		tt3.run();
    		
    		// 쓰레드 처리를 하는 run()메소드는 직접호출하지 않고 start()메소드를 호출
    		// 쓰레드 등록한다
    		tt1.start();
    		tt2.start();
    		tt3.start(); // 3개의 스레드가 시간할당 해가면서 무작위로 수행됨
    	}
    
    }

     

    2. Runnable 인터페이스 상속

    public class RunnableTest implements Runnable { // 현재의 클래스가 이미 다른 클래스로부터 상속 받고 있다면 Runnable 인터페이스를 이용
    	String msg; 
    	
    	public RunnableTest() {}
    	public RunnableTest(String msg) {
    		this.msg = msg;
    	}
    	
    	// run()오버라이딩
    	public void run(){
    		for(int i=1000; i<=1200; i++) {
    			System.out.println(msg+"=>"+i);
    		}
    	}
    	
    
    	public static void main(String[] args) {
    		 RunnableTest rt1 = new RunnableTest("first");
    		 RunnableTest rt2 = new RunnableTest("second");
    		 
    		 Thread t1 = new Thread(rt1); // 결국 thread 클래스는 필요함
    		 Thread t2 = new Thread(rt2);
    		 
    		 // 우선순위 설정
    		 t1.setPriority(Thread.MAX_PRIORITY);
    		 t1.start();
    		 t2.start();
    
    	}
    
    }

     

    • 동기화

    - 다른 것이 실행중인 동안 대기

    
    public class ATM implements Runnable {
    	private int money = 20000;
    	public ATM() {}
    	
    	//오버라이딩
    	public void run() {
    		synchronized(this) {
    			for(int i=1; i<=10; i++) {
    				getMoney(1000);
    				
    				// 동기화해제, 동기화 설정
    				if(money%2000==0) { // 동기화해제 : 다른스레드가 실행될수 있도록
    					try {
    						this.wait();
    					}catch(Exception e) {}
    					
    				}else { // 동기화: 다른스레드는 대기모드로 처리
    					this.notify();
    				}
    				
    			}
    		}
    		
    	}
    	
    	public void getMoney(int cash) {
    		if(money>0) { // 출금
    			money -= cash;
    			// 실행되고있는 thread의 이름구하기
    			System.out.println(Thread.currentThread().getName()+"잔액은 "+money+"원");
    		}else {
    			System.out.println("잔액 부족");
    		} //아들이 인출하는 동안 엄마가 인출하기때문에 출력결과가 이상하게 나옴
    		
    	}
    	// 엄마가 인출하는 동안 아들은 대기, 아들이 인출하는동안 엄마가 대기
    	// 동기화 : 스레드 메소드가 실행중인 동안에 다른 스레드는 대기상태
    	// 메소드에 syncronized 키워드를 표기
    	
    
    	public static void main(String[] args) {
    		ATM atm = new ATM();
    		
    		Thread mother = new Thread(atm, "mother");
    		Thread son = new Thread(atm, "son");
    		
    		mother.start();
    		son.start();
    	}
    
    }

    혹은 

    	public synchronized void run() {
            for(int i=1; i<=10; i++) {
            getMoney(1000);
    		}	
    	}

     

     

     

     

     

     

     

     

     

     

     

     

    'Java' 카테고리의 다른 글

    객체지향프로그래밍 (한화인턴교육)  (0) 2021.11.29
    입출력(I/O)  (0) 2021.11.29
    상속 과제물  (0) 2021.11.25
    Collection  (0) 2021.11.25
    예외처리  (0) 2021.11.25

    댓글

Designed by Tistory.