有三种使用线程的方法:
- 继承 Thread 类
- 实现 Runnable 接口
- 实现 Callable 接口
实现 Runnable 和 Callable 接口的类只能当做一个可以在线程中运行的任务,不是真正意义上的线程,因此最后还需要通过 Thread 来调用。可以说任务是通过线程驱动从而执行的。
一般采用实现接口的方式创建线程。
1、继承 Thread 类
public class Create extends Thread {
@Override
public void run() {
for (int i=0;i<20;i++){
System.out.println(Thread.currentThread().getName()+i);
}
}
public static void main(String[] args) {
Create c1 = new Create();
c1.setName("thread");
c1.start();
for (int i=0;i<10;i++){
System.out.println(Thread.currentThread().getName()+i);
}
}
}
2、实现 Runnable 接口
public class Create implements Runnable{
@Override
public void run() {
for (int i=0;i<20;i++){
System.out.println(Thread.currentThread().getName()+i);
}
}
public static void main(String[] args) {
Create c = new Create();
Thread thread1 = new Thread(c,"runable");
t1.start();
for (int i=0;i<10;i++){
System.out.println(Thread.currentThread().getName()+i);
}
}
}
3、实现 Callable 接口
public class Create implements Callable<Integer>{
@Override
public Integer call() throws Exception {
for (int i=0;i<20;i++){
System.out.println(Thread.currentThread().getName()+i);
}
return 123;
}
public static void main(String[] args) throws InterruptedException, ExecutionException {
Create c2 = new Create();
FutureTask<Integer> ft = new FutureTask<>(c2);
Thread t2 = new Thread(ft);
t2.start();
//Callable 可以有返回值,返回值通过 FutureTask 进行封装,通过ft.get()可以获得返回值
// System.out.println(ft.get());
for (int i=0;i<20;i++){
System.out.println(Thread.currentThread().getName()+i);
}
}
}