• java创建线程的几种方式


    1.通过实现Runnable接口创建线程

    package com.javaBase.LineDistance;
    
    /**
     * 〈一句话功能简述〉;
     * 〈功能详细描述〉
     *
     * @author jxx
     * @see [相关类/方法](可选)
     * @since [产品/模块版本] (可选)
     */
    public class testRunn implements Runnable {
    
    
        @Override
        public void run() {
            System.out.println("123");
        }
    }
    package com.javaBase.LineDistance;
    
    /**
     * 〈一句话功能简述〉;
     * 〈多线程测试代码〉
     *
     * @author jxx
     * @see [相关类/方法](可选)
     * @since [产品/模块版本] (可选)
     */
    public class testLine {
    
        public static void main(String[] args){  
            Thread t = new Thread(new testRunn());
            t.start();
        }
    }

    2.通过实现callable接口创建线程

    package com.javaBase.LineDistance;
    
    import java.util.concurrent.Callable;
    
    /**
     * 〈一句话功能简述〉;
     * 〈功能详细描述〉
     *
     * @author jxx
     * @see [相关类/方法](可选)
     * @since [产品/模块版本] (可选)
     */
    public class TestCallable implements Callable {
    
        @Override
        public Object call() throws Exception {
            System.out.println("123");
            return "1";
        }
    }
    package com.javaBase.LineDistance;
    
    import java.util.concurrent.Callable;
    import java.util.concurrent.FutureTask;
    
    /**
     * 〈一句话功能简述〉;
     * 〈多线程测试代码〉
     *
     * @author jxx
     * @see [相关类/方法](可选)
     * @since [产品/模块版本] (可选)
     */
    public class testLine {
    
        public static void main(String[] args){
            Callable call = new TestCallable();
            FutureTask future = new FutureTask(call);
            Thread t2 = new Thread(new testRunn());
            t2.start();
        }
    }

    3.通过集成Thread类创建线程

    package com.javaBase.LineDistance;
    
    /**
     * 〈一句话功能简述〉;
     * 〈功能详细描述〉
     *
     * @author jxx
     * @see [相关类/方法](可选)
     * @since [产品/模块版本] (可选)
     */
    public class TestThread extends Thread {
    
        @Override
        public void run() {
            System.out.println("123");
        }
    
        public static void main(String[] args){
            Thread t = new TestThread();
            t.start();
        }
    }

    4.使用Executor框架来创建线程池

      在Java 5之后,并发编程引入了一堆新的启动、调度和管理线程的API。Executor框架便是Java 5中引入的,其内部使用了线程池机制,它在java.util.cocurrent 包下,通过该框架来控制线程的启动、执行和关闭,可以简化并发编程的操作。因此,在Java 5之后,通过Executor来启动线程比使用Thread的start方法更好,除了更易管理,效率更好(用线程池实现,节约开销)外,还有关键的一点:有助于避免this逃逸问题——如果我们在构造器中启动一个线程,因为另一个任务可能会在构造器结束之前开始执行,此时可能会访问到初始化了一半的对象用Executor在构造器中。

    package com.javaBase.LineDistance;
    
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    
    /**
     * 〈一句话功能简述〉;
     * 〈功能详细描述〉
     *
     * @author jxx
     * @see [相关类/方法](可选)
     * @since [产品/模块版本] (可选)
     */
    public class TestExcetor {
    
        public static void main(String[] args){
            ExecutorService executorService = Executors.newCachedThreadPool();
            executorService.execute(new testRunn());
            executorService.shutdown();
        }
    }

    Executor框架后面再详解。

    5.Runnable和Callable的区别

    • Callable规定的方法是call(),Runnable规定的方法是run()
    • Callable的任务执行后可返回值,而Runnable的任务是不能返回值得
    • call方法可以抛出异常,run方法不可以
    • 运行Callable任务可以拿到一个Future对象,表示异步计算的结果。它提供了检查计算是否完成的方法,以等待计算的完成,并检索计算的结果。通过Future对象可以了解任务执行情况,可取消任务的执行,还可获取执行结果。
  • 相关阅读:
    PHP之常用设计模式
    MySQL之慢查询日志和通用查询
    mysql之找回误删数据
    PHPer未来路在何方...
    如何成为更优秀的程序员
    常见的 CSRF、XSS、sql注入、DDOS流量攻击
    API接口TOKEN设计
    成为更好的程序员的八中途径
    奉秉格言
    PHP优化与提升
  • 原文地址:https://www.cnblogs.com/jxxblogs/p/11646830.html
Copyright © 2020-2023  润新知