zoukankan      html  css  js  c++  java
  • 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对象可以了解任务执行情况,可取消任务的执行,还可获取执行结果。
  • 相关阅读:
    Python中的BeautifulSoup模块
    requests模块
    requests模块
    python中让输出不换行
    python中让输出不换行
    我为Dexposed续一秒——论ART上运行时 Method AOP实现
    Python2中的urllib、urllib2和 Python3中的urllib、requests
    Python2中的urllib、urllib2和 Python3中的urllib、requests
    Fidder抓包软件的使用
    Fidder抓包软件的使用
  • 原文地址:https://www.cnblogs.com/jxxblogs/p/11646830.html
Copyright © 2011-2022 走看看