JAVA 기초

JAVA 17-2

Vanillwa 2023. 9. 5. 01:40

Thread (스레드)

스레드는 프로세스안에서 작업을 실행하는 단위

 

package ex1_thread;

//스레드 구현 방법 1
//Thread 클래스 상속 받기

public class ThreadTest extends Thread{
	@Override
	public void run() {
		//스레드 작동시 작업할 내용 작성
		for(int i=0;i<3;i++) {
			System.out.println("스레드 진행중"+i);
		}
	}
}
package ex1_thread;

//스레드를 구현하는 방법 2
//Runnable 인터페이스를 구현

public class RunnableTest implements Runnable{
	@Override
	public void run() {
		//작업할 내용 코드 작성
		for(int i=0;i<3;i++) {
			System.out.println("러너블 진행중"+i);
		}
	}
}
package ex1_thread;

public class ThreadMain {
	public static void main(String[] args) {
		ThreadTest tt = new ThreadTest();
		tt.start(); // run()메서드를 호출하는 메서드
		
		RunnableTest rt = new RunnableTest();
		Thread t = new Thread(rt);
		t.start();
		
		for(int i=0;i<3;i++) {
			System.out.println("메인 진행중"+i);
		}
	}
}

실행 결과


 

스레드 이름, 상태, 순위

 

package ex2_thread;

public class ThreadName extends Thread{
	@Override
	public void run() {
		setName("Thread3");

		System.out.println("현재 실행되고 있는 스레드 이름 : "+Thread.currentThread().getName());
		System.out.println("현재 실행되고 있는 스레드 상태 : "+Thread.currentThread().getState());
		System.out.println("현재 실행되고 있는 스레드 순위 : "+Thread.currentThread().getPriority());
	}
}
package ex2_thread;

public class ThreadMain {
	public static void main(String[] args) {
		ThreadName tn = new ThreadName();
		tn.start();
		
		System.out.println("현재 실행되고 있는 스레드 이름 : "+Thread.currentThread().getName());
		System.out.println("현재 실행되고 있는 스레드 상태 : "+Thread.currentThread().getState());
		System.out.println("현재 실행되고 있는 스레드 순위 : "+Thread.currentThread().getPriority());
	}
}

실행 결과


 

Synchronized

package ex3_synchronized;

public class Bank {
	private int money=0;
	
	public int getMoney() {
		return money;
	}
	
	//스레드가 메서드를 점유할 때 다른 스레드가 점유하지 못하도록 하는 키워드 / 성능 저하가 일어날 수 있음
//	public synchronized void addMoney(int money) {
//		this.money += money;
//	}
	
	public void addMoney(int money) {
		this.money += money;
	}
}
package ex3_synchronized;

class AddThread implements Runnable{
	private Bank b;
	private String name;
	public AddThread(String name, Bank b) {
		this.name = name;
		this.b = b;
	}
	
	@Override
	public void run() {
		//블럭 동기화 : 특정 영역만 동기화 처리
		synchronized (b) {
			try {
				for(int i=0;i<5;i++) {
					Thread.sleep(1);//1ms동안 중지
					b.addMoney(1000);
					System.out.println(name+" 현재 잔고 : "+b.getMoney());
				}
			} catch (InterruptedException e) {
				e.printStackTrace();
			} 
		}
	}
}


public class BankMain {
	public static void main(String[] args) {
		Bank b = new Bank();
		Thread t1 = new Thread(new AddThread("1번", b));
		Thread t2 = new Thread(new AddThread("2번", b));
		t1.start();
		t2.start();
	}
}

실행 결과


 

'JAVA 기초' 카테고리의 다른 글

JAVA 19-1  (0) 2023.09.06
JAVA 18-1  (0) 2023.09.05
JAVA 17-1  (0) 2023.09.05
JAVA 16-2  (0) 2023.09.01
JAVA 16-1  (0) 2023.09.01