-
쓰레드(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