Java创建线程的几种方式

文章介绍了Java中实现多线程的三种方式:继承Thread类、实现Runnable接口和Callable接口。Thread的start()方法启动新线程执行run()。当需要扩展其他类时,可以选择实现Runnable。Callable接口允许返回值和抛出异常。线程池如ExecutorService通过Executors创建,能有效管理线程资源,提高效率。
摘要由CSDN通过智能技术生成
  1. 继承Thread类
    Thread类本质上实现了Runnable接口的一个实例,代表了一个线程的实例,启动线程的唯一方法就是通过Thread的start()实例方法。start()是一个native方法,他启动一个新线程,并执行run()方法。
public class KobeThreadTest extends Thread {
    @Override
    public void run() {
        for (int i = 0; i < 50; i++) {
            System.out.println("鸡你太美:" + i);
        }
    }

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

2.实现Runnable接口
如果自己的类已经exteds另一个类,那么无法继承Thread类,此时可以实现Runnable接口。

public class KobeRunnableTest implements Runnable{
    @Override
    public void run() {
        for (int i = 0; i < 50; i++) {
            System.out.println("鸡你太美:" + i);
        }
    }

    public static void main(String[] args) {
        KobeRunnableTest kobeRunnableTest=new KobeRunnableTest();
        Thread thread=new Thread(kobeRunnableTest);
        thread.start();
    }
}
  1. 使用Callable有返回值的线程
    使用callable创建线程能够返回线程数据,与Runnable接口类似,也需要通过创建Thread类来创建线程。callable任务后可以获得一个FutureTask对象,调用该对象的.get()方法就可以获取到callable任务的返回值。
public class KobeCallableTest implements Callable {
    @Override
    public Object call() {
        for (int i = 0; i < 50; i++) {
            System.out.println("鸡你太美:" + i);
        }
        return "收到律师函";
    }

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        KobeCallableTest kobeCallableTest = new KobeCallableTest();
        FutureTask futureTask = new FutureTask(kobeCallableTest);
        Thread thread = new Thread(futureTask);
        thread.start();
        //拿到线程的返回值
        System.out.println(futureTask.get());
    }
}
  1. 使用ThrealPool线程池
    线程和数据库连接这些资源都很宝贵,每次创建和销毁造成不必要的资源消耗,那么我们可以使用缓存的策略来创建,那就是使用到了线程池。Java线程池的顶级接口是Executor,但是严格意义上Executor并不是一个线程池,而是一个执行线程的工具,真正的线程池接口是ExecutorService
public class KobeThreadPoolTest {
    public static void main(String[] args) {
        ExecutorService executorService=Executors.newCachedThreadPool();
        for (int i = 0; i < 5; i++) {
            executorService.execute(new Runnable() {
                @Override
                public void run() {
                    for (int i = 0; i < 50; i++) {
                        System.out.println(Thread.currentThread().getName() + "鸡你太美:" + i);
                    }
                }
            });
        }
        executorService.shutdown();
    }
}

总结:

  • Runnable和Callable接口实现方式适合多个线程进行资源共享。因为继承Thread属于Java中的单一继承,接口则可以多实现,提高了扩展性。线程池中只能使用接口实现,不能直接继承Thread实现。
  • Runnable重写的是run()方法,没有返回值,并且不可抛出异常。
  • Callable重写的是call()方法,可以有返回值,可以抛出异常,并且可以通过Future对象可以了解任务的执行情况。
  • 使用线程池创建可以避免资源过度消耗,提升效率。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值