기초 뽀개기 - 스레드

Clean Code Big Poo·2025년 4월 20일
0
post-thumbnail

Overview

자바 무료강의 2시간 완성을 시청하고 간략히 정리

Thread

여러 작업을 동시에 진행할 때 사용

사용 방법

class 클래스명 extends Thread{
	public void run(){
    	// 명령문; 
    }
}

예제

public class Main {
    public static void main(String[] args) {
        MyThread myThread = new MyThread();

        myThread.start();
    }
}

class MyThread extends Thread{
    public void run() {
        for(int i = 1; i < 5; i++){
            System.out.println("Thread : "+i);
        }
    }
}

runnable

여러 작업을 동시에 진행할 때 사용
Interface
diff ) 자바는 class를 다중 상속할 수 없다. interface 를 상속 받으면 다른 클래스를 상속 받을 수 있다.

사용방법

class 클래스명 implements Runnable{
	public void run(){
    	// 명령문; 
    }
}

예제

public class Main {
    public static void main(String[] args) {
        MyRunnable myRunnable = new MyRunnable();
        Thread thread = new Thread(myRunnable);
        thread.start();
    }
}

class MyRunnable implements Runnable{
    public void run(){
        for(int i = 1; i < 5; i++){
            System.out.println("Runnable : "+i);
        }
    }
}

join

스레드 실행을 멈출 때까지 대기

예제

public class Main {
    public static void main(String[] args) throws InterruptedException { 
    // 예외 처리 위해 InterruptedException 추가
        MyThread myThread = new MyThread();
        myThread.start();
        myThread.join(); // myThread 끝날때까지 대기
        method();
    }

    public static void method() {
        for(int i = 1; i < 5; i++){
            System.out.println("method : "+i);
        }
    }
}

class MyThread extends Thread{
    public void run() {
        for(int i = 1; i < 5; i++){
            System.out.println("Thread : "+i);
        }
    }
}

다중 스레드

여러 스레드를 동시에 수행

예제

public class Main {
    public static void main(String[] args) throws InterruptedException {
        MyThread myThread1 = new MyThread(1);
        myThread1.start();

        MyThread myThread2 = new MyThread(2);
        myThread2.start();
    }
}

class MyThread extends Thread{
    private int seq; // 스레드 순번을 저장할 변수

    public MyThread(int seq) {
        this.seq = seq;
    }

    public void run() {
        for(int i = 1; i < 5; i++){
            System.out.println("Thread seq: " + seq + " - " + i);
        }
    }
}

동기화

여러 스레드가 공유된 자원에 동시에 접근하지 못하도록 막음
하나의 스레드가 synchronized를 수행하는 동안 다른 스레드는 사용할 수 없음

사용

synchronized 메소드명(){

}

synchronized(변수){
 // 변수에 대한 작업 
 // 어떤 스레드가 변수에 대한 작업을 하는 동안 다른 스레드는 사용 불가
}

예제

public class Main {
    public static void main(String[] args) throws InterruptedException {
        SharedData sharedData = new SharedData();

        Thread thread1 = new Thread(()->{
            for (int i=0; i < 1000; i++){
                sharedData.incremennt();
            }
        });

        Thread thread2 = new Thread(()->{
            for (int i=0; i < 1000; i++){
                sharedData.incremennt();
            }
        });

        thread1.start();
        thread2.start();

        thread1.join();
        thread2.join();

        System.out.println("SharedData : "+sharedData.data);
        // 2000 
    }
}

class SharedData{
    public int data = 0;
    synchronized public void incremennt(){
        data++;
    }
}

0개의 댓글