创建线程的方法
一般来说我们比较常用的有以下四种方式,下面先介绍它们的使用方法。
1、继承 Thread 类
通过继承 Thread 类,并重写它的 run 方法,我们就可以创建一个线程。
- 首先定义一个类来继承 Thread 类,重写 run 方法。
- 然后创建这个子类对象,并调用 start 方法启动线程。
点击查看代码
public class ThreadTest extends Thread{
@Override
public void run() {
System.out.println("测试线程");
}
public static void main(String[] args) {
new ThreadTest().start();
}
}
2.实现 Runnable 接口
通过实现 Runnable ,并实现 run 方法,也可以创建一个线程。
- 首先定义一个类实现 Runnable 接口,并实现 run 方法。
- 然后创建 Runnable 实现类对象,并把它作为 target 传入 Thread 的构造函数中
- 最后调用 start 方法启动线程。
点击查看代码
public class ThreadTest implements Runnable{
@Override
public void run() {
System.out.println("测试线程");
}
public static void main(String[] args) {
new Thread(new ThreadTest()).start();
}
}
3.实现 Callable 接口,并结合 Future 实现
- 首先定义一个 Callable 的实现类,并实现 call 方法。call 方法是带返回值的。
- 然后通过 FutureTask 的构造方法,把这个 Callable 实现类传进去。
- 把 FutureTask 作为 Thread 类的 target ,创建 Thread 线程对象。
- 通过 FutureTask 的 get 方法获取线程的执行结果。
点击查看代码
public class ThreadTest{
public static void main(String[] args) throws ExecutionException, InterruptedException {
FutureTask<Integer> task = new FutureTask<>(new MyThread());
new Thread(task).start();
//获取线程执行结果,阻塞式
Integer result = task.get();
System.out.println(result);
}
}
class MyThread implements Callable<Integer>{
@Override
public Integer call() throws Exception {
return new Random().nextInt(100);
}
}
4.通过线程池创建线程
此处用 JDK 自带的 Executors 来创建线程池对象。
首先,定一个 Runnable 的实现类,重写 run 方法。
然后创建一个拥有固定线程数的线程池。
最后通过 ExecutorService 对象的 execute 方法传入线程对象。
点击查看代码
public class ThreadTest implements Runnable{
@Override
public void run() {
System.out.println("测试线程");
}
public static void main(String[] args) {
ThreadPoolExecutor executor = new ThreadPoolExecutor(30, 40, 60, TimeUnit.SECONDS, new ArrayBlockingQueue<>(100));
for (int i = 0; i < 10; i++) {
executor.execute(new ThreadTest());
}
executor.shutdown();
}
}