zoukankan      html  css  js  c++  java
  • 并发编程(壹):创建线程的三种方式及其对比

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


    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类,不可继承其他类.
  • 相关阅读:
    zoj 3135 Party of 8g 最大点权独立集
    hdu 5352 MZL's City 最小费用最大流
    hdu 5351 MZL's Border 打表+高精度
    poj 3155 Hard Life 最大密度子图
    希尔排序的温习
    折半查找法的温习
    几所可能去的院校之对比与抉择
    重温排序算法
    5-17 汉诺塔的非递归实现 (25分)
    c语言从文件中读取数据作为输入
  • 原文地址:https://www.cnblogs.com/xzy-/p/10921288.html
Copyright © 2011-2022 走看看