1.繼承Thread類,重寫run方法
public class Thread3 {
public static void main(String[] args) {
new Thread("線程1") {
public void run() {
for(int i=0;i<5;i++) {
System.out.println(Thread.currentThread().getName()+":"+i);
}
};
}.start();
System.out.println("主線程");
}
}
結果:
2.實現Runnable接口的run方法
public class Thread3 {
public static void main(String[] args) {
new Thread(new Runnable() {
public void run() {
for(int i=0;i<5;i++) {
System.out.println(Thread.currentThread().getName()+":"+i);
}
};
},"線程2").start();
System.out.println("主線程");
}
}
結果:
3.實現Callable的call方法,配合FutureTask可以獲得線程執行返回的結果
FutureTask的get()方法阻塞等待線程返回結果
public class Thread1 implements Callable<Integer>{
public static void main(String[] args) {
Thread1 thread1 = new Thread1();
FutureTask<Integer> ft = new FutureTask<Integer>(thread1);
new Thread(ft,"有返回值的線程").start();
try {
System.out.println("返回值:"+ft.get());
} catch (InterruptedException | ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public Integer call() throws Exception {
int i = 0;
for(;i<4;i++) {
System.out.println(Thread.currentThread().getName()+":"+i);
}
return i;
}
}
結果: