• 面试题-多线程篇-Java语言创建线程有几种不同的方式


    Java语言中,创建线程主要有四种不同的方式:

    1.继承Thread类:Java中的Thread类是实现线程的最基本方法。你可以通过继承Thread类并重写其run()方法来创建新线程。然后你可以创建Thread的实例,并调用start()方法启动新线程。

     
    
    1. javapublic class MyThread extends Thread {
    2. @Override
    3. public void run() {
    4. System.out.println("This is a thread created by extending Thread class");
    5. }
    6. }
    7. public class Main {
    8. public static void main(String[] args) {
    9. MyThread myThread = new MyThread();
    10. myThread.start();
    11. }
    12. }

    2.实现Runnable接口:如果你有一个已经存在的类,而你不想让它继承Thread类,你可以让这个类实现Runnable接口。然后你可以创建一个Thread对象,把你的Runnable对象作为参数传递给Thread的构造函数,然后调用start()方法启动新线程。

     
    
    1. javapublic class MyRunnable implements Runnable {
    2. @Override
    3. public void run() {
    4. System.out.println("This is a thread created by implementing Runnable interface");
    5. }
    6. }
    7. public class Main {
    8. public static void main(String[] args) {
    9. Thread thread = new Thread(new MyRunnable());
    10. thread.start();
    11. }
    12. }

    3.使用Executor框架:Java的Executor框架提供了一种更为高级的方式来创建和管理线程。你可以创建一个ExecutorService,然后使用它的submit()方法提交一个Callable对象,这会返回一个Future对象。你也可以使用ExecutorService的execute()方法来执行一个Runnable对象。这两种方法都会在新线程中运行你的任务。

     
    
    1. javapublic class MyCallable implements Callable<String> {
    2. @Override
    3. public String call() throws Exception {
    4. return "Hello, World!";
    5. }
    6. }
    7. public class Main {
    8. public static void main(String[] args) throws ExecutionException, InterruptedException {
    9. ExecutorService executorService = Executors.newSingleThreadExecutor();
    10. Future<String> future = executorService.submit(new MyCallable());
    11. System.out.println(future.get());
    12. executorService.shutdown(); // 关闭线程池,不关闭的话,程序可能无法正常退出
    13. }
    14. }

    4.使用线程池(ThreadPoolExecutor):用 ExecutorService 创建线程
    注意:不建议用 Executors 创建线程池,建议用 ThreadPoolExecutor 定义线程池。
    用的无界队列,可能造成 OOM ;不能自定义线程名字,不利于排查问题。

    以上四种方式底层都是基于 Runnable

  • 相关阅读:
    学习永不止步!誉天9月开班计划来啦!
    QGIS创建要素与属性
    Java8新特性你知道哪些?
    Cookie 客户端, Session与Cookie区别
    Java客户端_zkclient库操作Zookeeper
    CSS :not-child() :nth-child()的一些常用属性
    docker 生成镜像的几个问题
    基于SSM的新闻管理系统
    C. Colorful Table CodeTON Round 6 (Div. 1 + Div. 2, Rated, Prizes!)
    TCP服务器使用多路复用
  • 原文地址:https://blog.csdn.net/qq_34783818/article/details/134004501