创建线程的方法

一般来说我们比较常用的有以下四种方式,下面先介绍它们的使用方法。
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();
    }
}
posted @ 2024-01-22 17:50  新手源  Views(8)  Comments(0Edit  收藏  举报