1.继承Thread类--不推荐
java单继承不多说,见例子
package create;
/**
* @author: suruomo
* @date: 2020/9/23 15:01
* @description: 继承Thread类创建线程
*/
public class ThreadDemo {
public static class Demo extends Thread {
@Override
public void run() {
System.out.println("start");
}
}
public static void main(String[] args){
Demo t = new Demo();
t.start();
}
}
2.实现Runnable接口
public class RunnableDemo {
public static class Demo implements Runnable {
@Override
public void run() {
System.out.println("start");
}
}
public static void main(String[] args){
Thread thread=new Thread(new Demo());
thread.start();
}
}
3.使用Executor框架
public class ExecutorDemo {
public static class Demo implements Runnable {
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+":start");
}
}
public static void main(String[] args){
Demo demo=new Demo();
ExecutorService executorService= Executors.newFixedThreadPool(5);
for (int i = 0; i < 5; i++) {
executorService.submit(demo);
}
}
}
4.使用FutureTask
使用Callable和FutureTask,可以实现有返回值的线程创建,并且可以抛出异常
public class FutureTaskDemo implements Callable<Integer> {
@Override
public Integer call() throws Exception {
// 计算1-100的和
int sum = 0;
for (int i = 1; i <= 100; i++) {
sum += i;
}
return sum;
}
public static void main(String[] args) {
FutureTaskDemo demo=new FutureTaskDemo();
// 使用Callable方式创建线程,需要FutureTask类的支持,用于接收运算结果,可以使用泛型指定返回值的类型
FutureTask<Integer> result=new FutureTask<>(demo);
//开启线程
new Thread(result).start();
int sum = 0;
// 接收运算结果
// 只有当该线程执行完毕后才会获取到运算结果,等同于闭锁的效果
try {
sum = result.get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
System.out.println("sum is " + sum);
}
}