-> 프로세스가 공장이라면 쓰레드는 일꾼!
Thread()
Thread(Runnable r)
Thread(Runnable r, String name)
Thread(String name)
class Mythread extends Thread{ public void run() { //Thread클래스의 run() 오버라이딩 /* 작업내용 */ }
MyThread t1 = new MyThread(); //쓰레드 생성 t1.start(); //쓰레드 실행
class MyThread2 implements Runnable { public void run() { //Runnable인터페이스의 추상메소드 run() 구현 /* 작업내용 */ }
Runnable r = new MyThread2(); Thread t2 = new Thread(r); //Thread(Runnable r) //Thread t2 = new Thread(new MyThread2()); <<줄인 것 t2.start();
이게 더 나은 방법!
ex13_01
public class Ex13_01 {
public static void main(String[] args) {
//1. Thread 상속 방법
Threadex1 t1 = new Threadex1();
//2. Runnable 구현 방법
Runnable r = new Threadex2();
Thread t2 = new Thread(r);
//줄이면 : Thread t2 = new Thread(new Threadex2());
t1.start();
t2.start();
}
}
class Threadex1 extends Thread{
public void run() {
for(int i=0; i<20; i++){
System.out.print(this.getName()); //thread의 이름 반환
//조상인 Thread클래스의 메소드. this 생략 가능
}
}
}
class Threadex2 implements Runnable{
public void run() {
for(int i=0; i<20; i++) {
System.out.print(Thread.currentThread().getName());
//깊게 생각말고 이렇게 호출한다는 점을 기억하면 됨
}
}
}
Thread-0Thread-0Thread-0Thread-0Thread-0Thread-0Thread-0Thread-0Thread-0Thread-0Thread-0Thread-0Thread-0Thread-0Thread-0Thread-1Thread-1Thread-1Thread-1Thread-1Thread-1Thread-1Thread-1Thread-1Thread-1Thread-1Thread-1Thread-1Thread-1Thread-1Thread-1Thread-1Thread-1Thread-1Thread-1Thread-0Thread-0Thread-0Thread-0Thread-0
public class Ex13_01 {
public static void main(String[] args) {
//1. Thread 상속 방법
Threadex1 t1 = new Threadex1();
//2. Runnable 구현 방법
Runnable r = new Threadex2();
Thread t2 = new Thread(r);
//줄이면 : Thread t2 = new Thread(new Threadex2());
// t1.start();
// t2.start();
for(int i=0; i<20; i++){
System.out.print(0); //thread의 이름 반환
//조상인 Thread클래스의 메소드. this 생략 가능
}
for(int i=0; i<20; i++) {
System.out.print(1);
//깊게 생각말고 이렇게 호출한다는 점을 기억하면 됨
}
}
}
0000000000000000000011111111111111111111
public class Ex13_01 {
public static void main(String[] args) {
//1. Thread 상속 방법
Threadex1 t1 = new Threadex1();
//2. Runnable 구현 방법
Runnable r = new Threadex2();
Thread t2 = new Thread(r);
//줄이면 : Thread t2 = new Thread(new Threadex2());
t1.start();
t2.start();
for(int i=0; i<20; i++){
System.out.print(0); //thread의 이름 반환
//조상인 Thread클래스의 메소드. this 생략 가능
}
for(int i=0; i<20; i++) {
System.out.print(1);
//깊게 생각말고 이렇게 호출한다는 점을 기억하면 됨
}
}
}
class Threadex1 extends Thread{
public void run() {
for(int i=0; i<20; i++){
System.out.print(this.getName()); //thread의 이름 반환
//조상인 Thread클래스의 메소드. this 생략 가능
}
}
}
class Threadex2 implements Runnable{
public void run() {
for(int i=0; i<20; i++) {
System.out.print(Thread.currentThread().getName());
//깊게 생각말고 이렇게 호출한다는 점을 기억하면 됨
}
}
}
Thread-0Thread-0Thread-0Thread-0Thread-0Thread-0Thread-0Thread-0Thread-0Thread-0Thread-0Thread-0Thread-0Thread-0Thread-0Thread-0Thread-0Thread-0Thread-0Thread-0000000000Thread-1Thread-1Thread-1Thread-1Thread-1Thread-1Thread-1Thread-1Thread-1Thread-1Thread-1Thread-1Thread-1Thread-1Thread-1Thread-1Thread-1Thread-1Thread-1Thread-10000000000011111111111111111111
요렇게 뒤섞임!
쓰레드를 생성한 후 -> start()를 호출해야 쓰레드가 작업을 시작한다.
BUT ✨start()했다고 바로 쓰레드가 실행되지 않는다.
✨OS 스케줄러가 실행순서를 결정한다. : OS에 종속적인 모습