首页 /  技术专区  /  Java 宽屏模式 >

Java中有哪几种方式来创建线程执行任务?

1. 继承Thread类

/**
 * 继承 Thread 实现多线程方式
 */
public class MyThread extends Thread {

    @Override
    public void run() {
       System.out.println("hello!");
    }

    public static void main(String[] args) {
        MyThread myThread = new MyThread();
        myThread.start();
    }
}

总结:重写的是run()方法,而不是start()方法,但是占用了继承的名额,Java中的类是单继承的。

讲到单继承,我们应该注意,java中的接口是可以多继承的


2. 实现Runnable接口

/**
 * 实现 Runnable 接口创建多线程方式
 */
public class MyThread02 implements Runnable {

    public void run() {
        System.out.println("hello!");
    }

    public static void main(String[] args) {
        Thread thread = new Thread(new MyThread02());
        thread.start();
    }
}


总结:实现Runnable接口,实现run()方法,使用依然要用到Thread,这种方式更常用


有时候,我们会直接使用匿名内部类的方式或者Lambda表达式的方式:

public class MyThread05 {

    public static void main(String[] args) {
        Thread thread = new Thread(new Runnable() {
            public void run() {
                System.out.println("hello!");
            }
        });
        thread.start();
    }
}


public class MyThread06 {

    public static void main(String[] args) {
        Thread thread = new Thread(() -> System.out.println("Hello!"));
        thread.start();
    }
}


3. 实现Callable接口

/**
 * 实现 Callable 接口实现多线程方式
 */
public class MyThread03 implements Callable<String> {

    public String call() throws Exception {
        return "Hello world!";
    }

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        FutureTask<String> futureTask = new FutureTask<String>(new MyThread03());
        Thread thread = new Thread(futureTask);
        thread.start();
        String result = futureTask.get();
        System.out.println(result);
    }
}


总结:实现Callable接口,实现call()方法,得使用Thread+FutureTask配合,这种方式支持拿到异步执行任务的结果

4. 利用线程池来创建线程


/**
 * 使用线程池方式创建线程
 */
public class MyThread04 implements Runnable{

    public void run() {
        System.out.println("hello");
    }

    public static void main(String[] args) {
        ExecutorService executorService = Executors.newFixedThreadPool(10);
        executorService.execute(new MyThread04());
    }
}


总结:实现Callable接口或者Runnable接口都可以,由ExecutorService来创建线程

注意,工作中不建议使用Executors来创建线程池

总结

以上几种方式,底层都是基于Runnable。




头像
0/200
图片验证码