四种方式
第一种:采用继承Thread类的方式,重新run方法
public class ThreadMain01 extends Thread {
@Override
public void run() {
System.out.println("演示如何通过Thread创建线程!");
}
public static void main(String[] args) {
System.out.println("Main...");
ThreadMain01 thread = new ThreadMain01();
thread.start();
System.out.println("Main...");
}
}
第二种:采用实现Runnable接口的方式,重写run方式
class ZiThread implements Runnable{
@Override
public void run() {
System.out.println("一个子线程");
}
}
public class ThreadMain02 {
public static void main(String[] args) {
new Thread(new ZiThread()).start();
new Thread(()->{
System.out.println("又一个子线程");
}).start();
}
}
第三种(1.5之后):采用实现Callable<>接口并创建FutureTask<>实例化,将接口实现类传入到FutureTask的构造方法中
此方式可以携带返回值
class ZiThread1 implements Callable<String> {
@Override
public String call() throws Exception {
return "子线程";
}
}
public class ThreadMain03 {
public static void main(String[] args) throws ExecutionException, InterruptedException {
FutureTask<String> futureTask = new FutureTask<>(new ZiThread1());
new Thread(futureTask).start();
System.out.println(futureTask.get());
}
}
第四种:采用线程池的方法创建
优点:
- 减少多次创建于销毁
- 提高效能,当使用时,可以直接在池中取到,不用直接归还
public class ThreadMain04 {
public static void main(String[] args) {
System.out.println("main....");
ExecutorService executorService = Executors.newFixedThreadPool(10);
executorService.execute(()->{
System.out.println("通过线程池来创建并管理线程");
});
executorService.shutdown();
System.out.println("main....");
}
}