线程的启动方式有哪几种?
- 继承Thread类,重写run()方法,使用thread.start()启动线程;
public class ThreadAndRunableTest {
public static void main(String[] args) {
Thread thread=new ThreadTest_1()
thread.start();
}
}
class ThreadTest_1 extends Thread{
@Override
public void run() {
System.out.println("继承Thread类,重写run()方法");
}
}
- 实现Runnable接口的实现run()方法,再利用Thread进行包裹,调用start()方法。
public class ThreadAndRunableTest {
public static void main(String[] args) {
Thread runnable=new Thread(new RunableTest());
runnable.start();
}
}
class RunableTest implements Runnable{
@Override
public void run() {
System.out.println("实现Runnable接口,重写run()方法");
}
}
- 实现 Callable 接口的call 方法,再用 FutureTask 类包裹 Callable 对象。然后再用 Thread 类包裹 FutureTask 类,并调用 start 方法。call() 方法可以有返回值,通过FutureTask对象的get()获得返回值。
import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;
public class CallableTest implements Callable {
@Override
public Integer call() throws Exception {
int sum = 0;
for (int i = 1; i <= 100; i++) {
sum += i;
}
return sum;
}
public static void main(String[] args) throws Exception {
CallableTest callableTest= new CallableTest(); //实例化 callable
FutureTask oneTask = new FutureTask(callableTest); //用FutureTask包裹
Thread oneThread = new Thread(oneTask); //用Thread包裹
oneThread.start();
System.out.print(oneTask.get()); //获取返回值
}
}