1、继承Thread类,重写run方法
public class Main {
static public void main(String[] args){
Thread thread = new Thread(){
public void run(){
System.out.println("正在执行的线程名:" + Thread.currentThread().getName());
}
};
thread.setName("自定义的线程");
thread.run(); //正在执行的线程名:main
thread.start(); //正在执行的线程名:自定义的线程
}
}
方法优点:直接使用匿名类实现,实现简单。
方法缺点:无法传入参数,也无法获得返回值
2、实现Runnable接口,交给Thread执行
public class Main {
static public void main(String[] args){
Runnable runnable = new Runnable() {
@Override
public void run() {
System.out.println("正在执行的线程名:" + Thread.currentThread().getName());
}
};
Thread thread = new Thread(runnable);
thread.setName("自定义的线程");
thread.run(); //正在执行的线程名:main
thread.start(); //正在执行的线程名:自定义的线程
}
}
3、实现Callable接口,配合FutureTask,交给Thread,可以传入参数,也可以获取结果
public class Main {
static public void main(String[] args) throws ExecutionException, InterruptedException {
Callable<Integer> callable = new Callable<Integer>() {
@Override
public Integer call() throws Exception {
System.out.println("线程名:"+ Thread.currentThread().getName()+". 正在执行逻辑");
return 99999;
}
};
FutureTask<Integer> futureTask = new FutureTask<Integer>(callable);
Thread thread = new Thread(futureTask);
thread.start();
while(!futureTask.isDone());
System.out.println(futureTask.get());
}
}
4、Callable配合线程池,使用Future获取结果
public class Main {
static public void main(String[] args) throws ExecutionException, InterruptedException {
Callable<Integer> callable = new Callable<Integer>() {
@Override
public Integer call() throws Exception {
System.out.println("线程名:"+ Thread.currentThread().getName()+". 正在执行逻辑");
return 99999;
}
};
ExecutorService executor = new ThreadPoolExecutor(5, Integer.MAX_VALUE,
60L, TimeUnit.SECONDS,
new SynchronousQueue<Runnable>());
Future future = executor.submit(callable);
while(!future.isDone());
System.out.println(future.get());
}
}
//alibaba编码规范要求创建线程池使用ThreadPoolExecutor