본문 바로가기
java

Thread 이해 와 생성

by improve 2024. 2. 21.

● Thread 는 프로그램 내에서 실행의 흐름을 이루는 최소단위

    main 메소드의 실행도 하나의 thread 에 의해 진행된다.

 

package org.example;

public class Main {
    public static void main(String[] args) {

        Runnable ran1 = new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 100; i++) {
                    System.out.println(Thread.currentThread().getName()+" "+i);
                }
            }
        };


        Runnable ran2 = () -> {
            for (int i = 0; i < 100; i++) {
                System.out.println(Thread.currentThread().getName()+" "+i);
            }
        };

        Thread t1 = new Thread(ran1);
        Thread t2 = new Thread(ran2);
        t1.start();
        t2.start();


        Thread ct = Thread.currentThread();
        System.out.println(ct.getName());


    }
}

 

익명 인터페이스 Runnable 를 사용한다.

start 로 실행을 한다.(Thread로)

 

● 둘 이상의 Thread 의 생성 

package org.example;

public class MyThread extends Thread {

    private String name;

    public MyThread(String name) {
        this.name = name;
    }

    public void run(){
        for (int i = 0; i < 100; i++) {
            if (name.equals("athread"))
                System.out.println("athread="+""+i);
            else
                System.out.println("이름이 다른 스레드="+i);
        }


    }


    public static void main(String[] args) {
        MyThread mt1 = new MyThread("athread");
        mt1.start();
        MyThread mt2 = new MyThread("다른쓰레드");
        mt2.start();
    }
}

 

출력되는 순서는 컴퓨터 마음이다.

 

●Thread 동기화

thread 의 공유를 하게 되면  증가와 감소에 대해 증가를 많이 할 수도 있고 감소를 많이 할 수도 있는데 

순서가 정해지지않았기 때문에 동기화가 필요하다. 

 

●비동기 방식

package org.example;

public class Main3 {
    public static void main(String[] args) throws InterruptedException {
        Ccount ccnt = new Ccount();

        Runnable task1 = () -> {
            for (int i = 0; i < 1000; i++) {
                ccnt.inc();
            }

        };

        Runnable task2 = () -> {
            for (int i = 0; i < 1000; i++) {
                ccnt.dec();
            }
        };

        Thread t1 = new Thread(task1);
        Thread t2 = new Thread(task2);
        t1.start();
        t2.start();
        t1.join(); // t1이참조하는 스레드의 종료를 기다림
        t2.join(); // t2이참조하는 스레드의 종료를 기다림

        System.out.println(ccnt.getCnnt());
    }
}

 

package org.example;

public class Ccount {
    private int cnnt;

    public void inc(){
        cnnt ++;
    }
    public void dec(){
        cnnt --;
    }

    public int getCnnt() {
        return cnnt;
    }
}

 

ccount 의 클래스는 증가와 감소 get을 선언해준다.

 

●동기방식

package org.example;

public class Ccount {
    private int cnnt;

    synchronized public void inc(){
        cnnt ++;
    }
    synchronized public void dec(){
        cnnt --;
    }

    public int getCnnt() {
        return cnnt;
    }
}

 

증가할때 다른걸 하지 않겠다 . 라는 선언 (synchronized)

감소할때 다른걸 하지 않겠다 . 라는 선언 (synchronized)

속도적인 부분에서 느릴 수 도 있다.

 

●또다른 동기화 방식

package org.example;

public class Ccount {
    private int cnnt;

     public void inc(){
        synchronized (this) {
            cnnt++;
        }
    }
     public void dec(){
        synchronized (this) {
            cnnt--;
        }
    }

    public int getCnnt() {
        return cnnt;
    }
}

 

cnnt 만 동기화를 하는 방식이다.

 

 

 

'java' 카테고리의 다른 글

GitHub sourceTree Token  (0) 2024.03.21
Thread 더 좋은 생성방법  (0) 2024.02.21
파일 시스템(NIO)  (0) 2024.02.20
문자 스트림  (0) 2024.02.19
입출력 필터 스트림  (0) 2024.02.19