OS로 부터 메모리를 할당받아
프로세스 상태가 됨.실제 작업을 수행하는 단위
는 Thread이다.context
static instance
race condition
이 발생할 수 있다.critical section
이라고 한다.동기화
를 구현하지 않으면 오류가 발생할 수 있다.class MyThread extends Thread{
public void run() {
int i;
for(i = 0; i<200; i++) {
System.out.print(i + "\t");
}
}
}
public class ThreadTest {
public static void main(String[] args) {
System.out.println(Thread.currentThread()); //현재 실행중인 Thread 확인
MyThread th1 = new MyThread();
th1.start();
MyThread th2 = new MyThread();
th2.start();
}
}
Runnable
인터페이스를 구현하도록 한다.class MyThread2 implements Runnable{
public void run(){
int i;
for(i=0; i<200; i++){
System.out.print(i + "\t");
}
}
}
public class ThreadTest2 {
public static void main(String[] args) {
System.out.println("main start");
MyThread2 mth = new MyThread2();
Thread th1 = new Thread(mth);
th1.start();
Thread th2 = new Thread(new MyThread2());
th2.start();
System.out.println("main end");
}
}
start
가 불리면 Thread가 Runnable
상태가 되고 CPU를 점유할 수 있는 상태가 된다.
그리고 Thread가 실행이 되고 끝나면 Dead
상태가 된다.
Not Runnable
은 절대 CPU를 점유할 수 없는 상태를 뜻하는데, Not Runnable 상태가 지속되면 이른바 좀비가 되어버린다.
millisecond
)만큼 Thread를 쉬게 만든다. 지정한 시간이 지나면 Thread가 다시 Runnable 한 상태가 된다. 확률이
높다.class PriorityThread extends Thread{
public void run(){
int sum = 0;
Thread t = Thread.currentThread();
System.out.println( t + "start");
for(int i =0; i<=1000000; i++){
sum += i;
}
System.out.println( t.getPriority() + "end");
}
}
public class PriorityTest {
public static void main(String[] args) {
int i;
for(i=Thread.MIN_PRIORITY; i<= Thread.MAX_PRIORITY; i++){
PriorityThread pt = new PriorityThread();
pt.setPriority(i);
pt.start();
}
}
}
Not Runnable
상태가 된다.Runnable
상태로 돌아온다.public class JoinTest extends Thread{
int start;
int end;
int total;
public JoinTest(int start, int end){
this.start = start;
this.end = end;
}
public void run(){
int i;
for(i = start; i <= end; i++){
total += i;
}
}
public static void main(String[] args) {
JoinTest jt1 = new JoinTest(1, 50);
JoinTest jt2 = new JoinTest(51, 100);
jt1.start();
jt2.start();
try{
jt1.join(); //join() 함수를 사용하지 않는 경우
jt2.join(); //Thread 실행 결과값이 기대값과 달라진다.
}catch (InterruptedException e) {
System.out.println(e);
}
int lastTotal = jt1.total + jt2.total;
System.out.println("jt1.total = " + jt1.total);
System.out.println("jt2.total = " + jt2.total);
System.out.println("lastTotal = " + lastTotal);
}
}
while(flag)
의 flag 변수값을 true로 바꾸어 종료 시킨다.💡Thread 종료하기 예제
‘A’ 를 입력 받으면 첫 번째 thread를
‘B’ 를 입력 받으면 두 번째 thread를
‘C’ 를 입력 받으면 세 번째 thread를
‘M’을 입력 받으면 모든 thread와 main() 함수를 종료한다.
public class TerminateThread extends Thread{
private boolean flag = false;
int i;
public TerminateThread(String name){
super(name);
}
public void run(){
while(!flag){
try {
sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println( getName() + " end" );
}
public void setFlag(boolean flag){
this.flag = flag;
}
public static void main(String[] args) throws IOException {
TerminateThread threadA = new TerminateThread("A");
TerminateThread threadB = new TerminateThread("B");
TerminateThread threadC = new TerminateThread("C");
threadA.start();
threadB.start();
threadC.start();
int in;
while(true){
in = System.in.read();
if ( in == 'A'){
threadA.setFlag(true);
}else if(in == 'B'){
threadB.setFlag(true);
}else if( in == 'C'){
threadC.setFlag(true);
}else if( in == 'M'){
threadA.setFlag(true);
threadB.setFlag(true);
threadC.setFlag(true);
break;
}
}
System.out.println("main end");
}
}