在Java中有幾種不同的方式創建線程,下面就說說創建線程的幾種不同的方式。
方式一、繼承Thread
繼承Thread類,重寫裏面的run()方法
public class ThreadDemo02 extends Thread{
@Override
public void run() {
System.out.println("線程名稱:"+Thread.currentThread().getName());
}
public static void main(String[] args) {
ThreadDemo02 demo02 = new ThreadDemo02();
demo02.start();
System.out.println("線程名稱:"+Thread.currentThread().getName());
}
}
看一下輸出結果:
已經有兩個線程了,啓動一個線程是調用start()方法,而不是調用重寫的run()方法,如果只是調用了run()方法,它並沒有開啓一個新的線程,下面就看看調用run()方法輸出的線程名稱。
實際上只有一個main線程,所以x.run()方法並不能開啓一個線程。
方式二、實現Runnable接口
實現Runnable接口,重寫 run()方法
public class ThreadDemo03 implements Runnable {
@Override
public void run() {
System.out.println("線程名稱:" + Thread.currentThread().getName());
}
public static void main(String[] args) {
ThreadDemo03 demo03 = new ThreadDemo03();
Thread t1 = new Thread(demo03);
t1.start();
System.out.println("線程名稱:"+Thread.currentThread().getName());
}
輸出結果:
方式三、實現Callable接口
實現Cabble接口,重寫call()方法,這個方法有返回值。
public class ThreadDemo04 implements Callable<String> {
@Override
public String call() throws Exception {
System.out.println("線程名稱:" + Thread.currentThread().getName());
return "hello world!!!";
}
public static void main(String[] args) {
ThreadDemo04 demo04 = new ThreadDemo04();
FutureTask futureTask = new FutureTask(demo04);
Thread t2 = new Thread(futureTask);
t2.start();
System.out.println("線程名稱:" + Thread.currentThread().getName());
}
}
輸出結果:
實際上Callable這個接口其實還是實現Runnable這個接口
小結一下:
實現多線程一共有三種方式:
一、繼承Thread類,重寫run()方法。
二、實現Runnable接口,重寫run()方法。
三、實現Callable<?>接口,重寫call()方法。