zoukankan      html  css  js  c++  java
  • 线程的创建方式

    最近在java工程师的面试中,经常被问到,请聊下线程的创建方式?而本篇文章就聊一下Java中创建线程的方式。

    第一种:继承Thread,并重写run方法

    代码如下:

    //1、继承Thread 重写run方法
    
    Thread thread=new Thread(){
    
        @Override
    
        public void run() {
    
            System.out.println(Thread.currentThread().getId()+"---->当前时间:"+LocalDateTime.now());
    
        }
    
    };
    
    //启动线程
    
    thread.start();

    第二种:实现Runnable接口,并重写run方法

    //2、线程的第二种创建方式  实现接口
    
    Runnable runnable=new Runnable() {
    
        @Override
    
        public void run() {
    
            System.out.println(Thread.currentThread().getName()+"------>"+LocalDateTime.now());
    
        }
    
    };
    
    //创建线程对象
    
    Thread thread=new Thread(runnable);
    
    //启动线程
    
    thread.start();

    第三种:Callable接口和Future接口

    在java5中,提供了Callable接口和Future接口,

    Callable接口可以是Runnable接口的增强版,Callable接口提供了一个call()方法作为线程执行体,call()方法比run()方法功能更强大Future接口来代表Callable接口里的call()方法的返回值,并为Future接口提供了一个FutureTask实现类,该实现类实现了Future接口,并实现了Runnable接口,所以这样可以作为Thread的target

    //创建对应的接口实现类和对应的返回值对象
    
    FutureTask<String> futureTask=new FutureTask<String>(new Callable<String>() {
    
        @Override
    
        public String call() throws Exception {
    
            return Thread.currentThread().getName()+"----->"+LocalDateTime.now();
    
        }
    
    });
    
    //创建线程
    
    Thread thread=new Thread(futureTask);
    
    //启动线程
    
    thread.start();
    
    System.out.println(futureTask.get());
     
    那么上述的三种创建方式有何优缺呢?
    继承Thread类来创建多线程,这种方式的优缺如下:
    优点:
            编写简单,使用当前的线程对象也很简单。
    缺点:
            因为继承了Thread类,所以不能再继承其他父类。毕竟Java只允许单继承。
    实现Runnable、Callable接口方式创建多线程的优缺如下:
    优点
            线程只是实现了Runable接口或者Callable接口,还可以继承其它类,毕竟Java允许多实现。
            多个线程可以共享同一个target对象,比较适合多个相同线程来处理同一份资源的情况,比如卖票。
    缺点:
    编程相对繁琐,如果需要使用当前线程,则必须使用Thread的currentThread()方法。
    总结:
    依据面向对象设计原则和日常的开发规范,推荐使用,实现Runnable、Callable接口的方式来创建多线程。
  • 相关阅读:
    Angular Universal教学-将现有专案导入Server Side Render
    [.NET] 使用ValidationContext快速进行模型资料的验证
    FINS/TCP_OMRON(1)
    C#中字段、属性、只读、构造函数赋值、反射赋值的相关
    async异步方法
    C# GetHashCode、Equals函数和键值对集合的关系
    JS三个编码函数和net编码System.Web.HttpUtility.UrlEncode比较
    ES6摘抄
    js基础
    js自执行函数、调用递归函数、圆括号运算符、函数声明的提升
  • 原文地址:https://www.cnblogs.com/qfchen/p/10655697.html
Copyright © 2011-2022 走看看