쓰레드, 프로세스 내에서 실제 작업을 수행하는 주체
- 보통 한 개의 프로세는 한 가지 일을 하지만, 쓰레드를 이용하면 한 프로세스 내에서 두 가지 이상의 일을 동시에 할 수 있다.
public class Test extends Thread{
public void run() { // Thread 상속시 run 메서드 구현해야 한다.
System.out.println("thread run");
}
public static void main(String[] args) {
Test test = new Test();
test.start(); // start()로 쓰레드 실행
}
}
>> thread run //실행
sample.start()
실행시 sample객체의 run 메소드 수행public class Test extends Thread{
int seq;
public Test(int seq){
this.seq=seq;
}
public void run(){
System.out.println(this.seq+" thread start."); // 쓰레드 시작
try {
Thread.sleep(1000); // 1초 대기
}catch (Exception e) {
}
System.out.println(this.seq+" thread.end."); //쓰레드 종료
}
public static void main(String[] args) {
for (int i=0; i<10; i++){ // 총 10개의 쓰레드 생성 및 실행.
Thread t = new Test(i);
t.start();
}
System.out.println("main end."); // main 메소드 종료
}
}
--------------------------------------------------
(출력 결과)
main end.
9 thread start.
0 thread start.
5 thread start.
8 thread start.
2 thread start.
4 thread start.
6 thread start.
1 thread start.
3 thread start.
7 thread start.
1 thread.end.
3 thread.end.
9 thread.end.
2 thread.end.
6 thread.end.
5 thread.end.
0 thread.end.
4 thread.end.
8 thread.end.
7 thread.end.
총 10개의 쓰레드를 실행시켰다.
Thread.sleep(1000)
)쓰레드는 순서 상관없이 동시 실행되며, 쓰레드 시작 전 main 메소드 종료되었다.
import java.util.ArrayList;
public class Test extends Thread{
int seq;
public Test(int seq){
this.seq=seq;
}
public void run(){
System.out.println(this.seq+" thread start."); // 쓰레드 시작
try {
Thread.sleep(1000); // 1초 대기
}catch (Exception e) {
}
System.out.println(this.seq+" thread.end."); //쓰레드 종료
}
public static void main(String[] args) {
ArrayList<Thread> threads = new ArrayList<>();
for (int i=0; i<10; i++){ // 총 10개의 쓰레드 생성 및 실행.
Thread t = new Test(i);
t.start();
threads.add(t);
}
for (int i = 0; i < 10; i++){
Thread t = threads.get(i);
try{
t.join(); // t 쓰레드 종료까지 대기
}catch (Exception e) {
}
}
System.out.println("main end."); // main 메소드 종료
}
}
---------------------------------------------------------------
(출력 결과)
7 thread start.
5 thread start.
1 thread start.
0 thread start.
3 thread start.
8 thread start.
2 thread start.
6 thread start.
4 thread start.
9 thread start.
9 thread.end.
8 thread.end.
5 thread.end.
7 thread.end.
3 thread.end.
4 thread.end.
6 thread.end.
1 thread.end.
0 thread.end.
2 thread.end.
main end.
ArrayList<Thread> threads = new ArrayList<>()
join()
: 쓰레드의 join 메소드는 쓰레드 종료 전까지 대기하는 메서드Thread 클래스 상속시 다른 클래스 상속 불가.
따라서, Runnable 인터페이스를 구현하는 방법을 주로 사용한다.
import java.util.ArrayList;
public class Test implements Runnable{
int seq;
public Test(int seq){
this.seq=seq;
}
public void run(){
System.out.println(this.seq+" thread start."); // 쓰레드 시작
try {
Thread.sleep(1000); // 1초 대기
}catch (Exception e) {
}
System.out.println(this.seq+" thread.end."); //쓰레드 종료
}
public static void main(String[] args) {
ArrayList<Thread> threads = new ArrayList<>();
for (int i=0; i<10; i++){ // 총 10개의 쓰레드 생성 및 실행.
Thread t = new Thread(new Test(i)); // 변경
t.start();
threads.add(t);
}
for (int i = 0; i < 10; i++){
Thread t = threads.get(i);
try{
t.join(); // t 쓰레드 종료까지 대기
}catch (Exception e) {
}
}
System.out.println("main end."); // main 메소드 종료
}
}
Thread t = new Thread(new Test(i));
Thread의 생성자로 Runnable 인터페이스 구현한 객체 넘기는데 사용