Java中有三种线程创建方式,分别为继承Thread类并重写run的方法,实现Runnable接口的run方法,使用FutureTask方式。
1. 继承Thread类方式的实现。
public class Thread1 extends Thread {
@Override
public void run() {
for(int i=1;i<=10;i++) {
System.out.println("多线程执行中..."+i);
}
}
public static void main(String[] args) {
//创建线程
Thread1 thread1=new Thread1();
//启动线程
thread1.start();
for(int i=0;i<10;i++) {
System.out.println("主线进行中..."+i);
}
}
}
上述代码中Thread1类继承了Thread类,并重写了run()方法,在main方法中创建了Thread1类的实例,并调用该对象start方法启动该线程,但此时该线程不一定马上执行,而是处于就绪状态,等待获取到CPU资源后才会运行。
2. 实现Runnable接口的run方法方式
public class RunnableTest1 implements Runnable {
@Override
public void run() {
for(int i=1;i<=10;i++) {
System.out.println("多线程执行中..."+i);
}
}
public static void main(String[] args) {
RunnableTest1 runRunnableTest1=new RunnableTest1();
new Thread(runRunnableTest1).start();
for(int i=0;i<10;i++) {
System.out.println("主线进行中..."+i);
}
}
}
3. 使用FutureTask方式
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
public class CallerTask implements Callable<String> {
@Override
public String call() throws Exception {
return "Hello world";
}
public static void main(String[] args) {
//创建异步任务
FutureTask<String> futureTask = new FutureTask<String>(new CallerTask());
//启动线程
new Thread(futureTask).start();
try {
//等待任务执行完毕,并返回结果
String result = futureTask.get();
System.out.println(result);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
}
上面代码中CallerTask类实现了Callable接口的call方法,在main方法中首先创建一个FutureTask对象,然后使用创建的FutureTask对象作为任务创建一个线程并调用start()方法启动该线程,最后通过futureTask.get()等待任务执行完毕并返回结果。
此方法相对于前两个方法的好处在于能够得到任务返回值。