• 并发编程(壹):创建线程的三种方式及其对比


    创建线程的三种方式及其对比


    1. 继承 Thread类

    (1). 继承Thread类。并重写run()方法,该方法无参数,无返回值;

    (2). 创建子类实例,并实例化对象;

    (3). 通过start()方法启动,注意:不是通过run()方法启动。

    public class ThreadDemo extends Thread{
        public void run(){
            System.out.println("继承Thread创建线程的.");
        }
    }
    
    public class ThreadAction {
        public static void main(String[] args) {
            Thread threadDemo=new ThreadDemo();
            threadDemo.start();
        }
    }
    

    2. 实现Runnable接口

    (1). 实现Runnable接口,并重新run()方法;

    (2). 创建Runnable实现类的实例,并用这个实例作为Thread的target创建线程对象;

    (3). 通过start()启动线程。

    public class RunnableDemo implements Runnable{
    
        @Override
        public void run() {
            System.out.println("实现Runnable创建线程的.");
        }
    }
    
    public class ThreadAction {
        public static void main(String[] args) {
            RunnableDemo runnableDemo = new RunnableDemo();
            Thread thread = new Thread(runnableDemo);
            thread.start();
        }
    }
    

    3. 通过Callable和Future创建线程

    产生背景:这种创建线程的方式在jdk1.5后出现,目的是弥补上面两种创建线程方式,其中的run()方法不能有返回值,不能抛出异常等问题。

    (1). 创建实现Callable的实现类,并实现call()方法;

    (2). 创建该实现类的实例(从java8开始可以直接使用Lambda表达式创建Callable对象);

    (3). 使用FutureTask类来包装Callable对象,该FutureTask对象封装了Callable对象的call()方法的返回值;

    (4). 使用FutureTask对象作为Thread对象的target创建并启动线程(因为FutureTask实现了Runnable接口);

    (5). 调用FutureTask对象的get()方法来获得子线程执行结束后的返回值。

    public class CallableDemo implements Callable<String> {
        
        @Override
        public String call() throws Exception {
            return "hello ,我是通过实现Callable接口的方式创建线程。";
        }
    }
    
    public class ThreadAction {
        public static void main(String[] args) {
            CallableDemo callableDemo = new CallableDemo();
            // 使用FutureTask类来包装Callable对象
            FutureTask<String> stringFutureTask = new FutureTask<>(callableDemo);
            Thread thread = new Thread(stringFutureTask);
            thread.start();
            try {
                System.out.println(stringFutureTask.get());
            } catch (InterruptedException | ExecutionException e) {
                e.printStackTrace();
            }
        }
    }
    

    4. 创建线程的三种方式的对比

    实现Runnable、Callable接口的方式创建多线程

    • 优势:该线程只是实现了接口,还可以继承其他类.在这种方式下多个线程共享一个target对象,所以非常适合多个相同线程来处理同一份资源的情况,从而可以将CPU、代码和数据分开,形成清晰的模型,较好地体现了面向对象的思想.
    • 劣势:编程稍微复杂,如果要访问当前线程,则必须使用Thread.currentThread()方法。

    继承Thread类

    • 优势:代码编写简单,当前Thread可用this获取.
    • 劣势:继承Thread类,不可继承其他类.
  • 相关阅读:
    AngularJS Insert Update Delete Using PHP MySQL
    Simple task manager application using AngularJS PHP MySQL
    AngularJS MySQL and Bootstrap Shopping List Tutorial
    Starting out with Node.js and AngularJS
    AngularJS CRUD Example with PHP, MySQL and Material Design
    How to install KVM on Fedora 22
    Fake_AP模式下的Easy-Creds浅析
    河南公务员写古文辞职信
    AI
    政协委员:最大愿望是让小学生步行上学
  • 原文地址:https://www.cnblogs.com/xzy-/p/10921288.html
Copyright © 2020-2023  润新知