zoukankan      html  css  js  c++  java
  • java中线程的三种实现方式

    一下记录下线程的3中实现方式:Thread,Runnable,Callable

    不需要返回值时,建议使用Runnable;有返回值时建议使用Callable

    代码如下所示:

    package com.four.day01;
    
    import java.util.concurrent.Callable;
    import java.util.concurrent.ExecutionException;
    import java.util.concurrent.FutureTask;
    
    /**
     * 此处主要是实现线程的三种方式
     * 1.继承Thread类
     * 2.实现runnable接口
     * 3.实现Callable接口
     * @author future
     *
     */
    public class TestThread {
        
         
        class MyThread extends Thread{
            public void run(){
                System.out.println("运行MyThread类中的run方法,使用继承创建线程");
            }
        }
         
        class MyRunnable implements Runnable{
            @Override
            public void run() {
                System.out.println("运行MyRunnable类中的run方法,使用实现Runnable接口创建线程");
            }
            
        }
        
        class MyCallable implements Callable<String>{
    
            @Override
            public String call() throws Exception {
                System.out.println("运行MyCallable类中的call方法,使用实现Callable接口创建线程");
                return "Class_Result";
            }
             
        }
    
        public static void main(String[] args) throws Exception {
            /**
             * 线程的启动,是通过Thread类中的start()方法进行启动的
             * 1.直接继承Thread时,直接实例化,调用实例中的start方法即可
             * 2.实现Runnable接口的,需要把Runnable实例化对象放到Thread的构造方法中进行初始化
             *   此线程运行后,没有返回结果,其运行的run方法是返回void类型的
             * 3.实现Callable接口的,需要把Callable接口包装一下,最终可以放到Thread中进行运行线程
             *   故通过FutureTask对Callable实例化对象进行包装,然后作为Thread的构造参数,
             *   使用Thread类中的start方法进行启动
             *   
             * 以上3者的区别
             *  Thread有单继承的局限性,若一个类继承线程Thread就不能继承其他类
             *  Runnable是接口,可以多实现,解决了单继承的问题,不过没有返回值
             *  Callable也是接口,不过线程运行完后会有返回值,是泛型的,可以自己指定
             *  程序中的实例是String类型的
             *  
             *  整体程序中,通过内部类进行实现的,在实例化内部类时,必须先实例化外部类(因为没有使用static修饰)
             */
            
            TestThread testThread=new TestThread();
            MyThread myThread=testThread.new MyThread();
            myThread.start();
            
            MyRunnable myRunnable=testThread.new MyRunnable();
            Thread t=new Thread(myRunnable);
            t.start();
            
            MyCallable myCallable=testThread.new MyCallable();
            FutureTask ftask=new FutureTask(myCallable);
            Thread t2=new Thread(ftask);
            t2.start();
            System.out.println("Callable接口的返回值是:"+ftask.get());
        }
    
    }

    运行结果为:

    运行MyThread类中的run方法,使用继承创建线程
    运行MyRunnable类中的run方法,使用实现Runnable接口创建线程
    运行MyCallable类中的call方法,使用实现Callable接口创建线程
    Callable接口的返回值是:Class_Result

  • 相关阅读:
    大组合取模之:1<=n<=m<=1e6,1<=p<=1e9
    大组合数取模之lucas定理模板,1<=n<=m<=1e9,1<p<=1e6,p必须为素数
    fzu2020( c(n,m)%p,其中n, m, p (1 <= m <= n <= 10^9, m <= 10^4, m < p < 10^9, p是素数) )
    lucas定理证明
    各类小公式
    x^a=b(mod c)求解x在[0,c-1]上解的个数模板+原根求法
    快速幂+乘模 模板
    hdu1695(容斥 or 莫比乌斯反演)
    poj1845(二分快速求等比数列模M和)
    2018JAVA面试题附答案
  • 原文地址:https://www.cnblogs.com/guopengxia0719/p/10657562.html
Copyright © 2011-2022 走看看