class SomeThread extends Thread{
@Override
public void run(){
//스레드로 동작한 코드
}
}
Thread t = new SomeThread();
t.start()
class SomeRunnable implements Runnable{
@Override
public void run(){
//스레드로 동작할 코드
}
}
Runnable r = new SomeRunnable();
Thread t = new Thread(r);
t.start();
다음의 이유로 2번 방법이 더 일반적이다.
1.Runnable 오브젝트를 사용하면 Thread 클래스가 아닌 다른 클래스를 상속해서 스레드를 만들 수 있다.
2.태스크 클래스가 Thread 클래스를 상속할 필요없이, 태스크와 Thread 오브젝트를 분리할 수 있다.
package threads;
class TimerThread extends Thread {
@Override
public void run() {
for (int i = 0; i < 4; i++) {
System.out.println(i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
}
}
}
public class TestTread {
public static void main(String[] args) {
TimerThread th = new TimerThread();
th.start();
}
}
package threads;
import java.util.Timer;
class TimerRunnable implements Runnable {
@Override
public void run() {
for (int i = 0; i < 4; i++) {
System.out.println(i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
}
}
}
public class TestRunnable {
public static void main(String[] args) {
Runnable r = new TimerRunnable();
Thread th = new Thread(new TimerRunnable());
th.start();
}
}
public class TestRunnableUsingLambdaExpression {
public static void main(String[] args) {
new Thread(() -> {
for (int i = 0; i < 4; i++) {
System.out.println(i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
}
}).start();
}
}
public class TestRunnableUsingMethodReference {
public static void main(String[] args) {
new Thread(new TestRunnableUsingMethodReference()::doSomeThing).start();
}
private void doSomeThing() {
for (int i = 0; i < 4; i++) {
System.out.println(i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
}
}
}