● 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 |