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();
}
}