• java多线程的三种实现方式


    关于java多线程实现方式,在老师授课时候只讲述了前2种,查了资料,借鉴了别人的博文内容还有其他方式,本文对自己熟悉的做了摘要描述,

    Java多线程实现方式有三种:继承Thread类、实现Runnable接口、实现Callable接口通过FutureTask包装器来创建Thread线程。

    其中前两种方式线程执行完后都没有返回值,最后一种是带返回值的,其实感觉最重要的还是前2种最基础,只要掌握前2种,其他方式都能很快的了解清楚。

    1、继承Thread类创建线程
    Thread类代表一个线程的实例。启动线程的唯一方法就是通过Thread类的start()实例方法,它将启动一个新线程,并执行run()方法。这种方式实现多线程很简单,通过自己的类直接extend Thread,并重写run()方法,就可以启动新线程并执行自己定义的run()方法。例如:

    复制代码
    public class MyThread extends Thread {  
      public void run() {  
       System.out.println("MyThread.run()");  
      }  
    }  
     
    MyThread myThread1 = new MyThread();  
    MyThread myThread2 = new MyThread();  
    myThread1.start();  
    myThread2.start();  
    复制代码

    2、实现Runnable接口创建线程
    基于类的单继承,如果类已经extends另一个类,就无法直接extends Thread,此时,可以实现一个Runnable接口,如下:

    public class MyThread extends OtherClass implements Runnable {  
      public void run() {  
       System.out.println("MyThread.run()");  
      }  
    }  

    为了启动MyThread,需要首先实例化一个Thread,并传入自己的MyThread实例:

    MyThread myThread = new MyThread();  
    Thread thread = new Thread(myThread);  
    thread.start();  

    事实上,当传入一个Runnable target参数给Thread后,Thread的run()方法就会调用target.run(),参考JDK源代码:

    public void run() {  
      if (target != null) {  
       target.run();  
      }  
    }  

    3、实现Callable接口通过FutureTask包装器来创建Thread线程

    Callable接口(也只有一个方法)定义如下:   

    public interface Callable<V>   { 
      V call() throws Exception;   } 
    复制代码
    public class SomeCallable<V> extends OtherClass implements Callable<V> {
    
        @Override
        public V call() throws Exception {
            // TODO Auto-generated method stub
            return null;
        }
    
    }
    复制代码
    复制代码
    Callable<V> oneCallable = new SomeCallable<V>();   
    //由Callable<Integer>创建一个FutureTask<Integer>对象:   
    FutureTask<V> oneTask = new FutureTask<V>(oneCallable);   
    //注释:FutureTask<Integer>是一个包装器,它通过接受Callable<Integer>来创建,它同时实现了Future和Runnable接口。 
      //由FutureTask<Integer>创建一个Thread对象:   
    Thread oneThread = new Thread(oneTask);   
    oneThread.start();   
    //至此,一个线程就创建完成了。
  • 相关阅读:
    打包下载,byte[] ,
    .net mvc 异常处理 IExceptionFilter,保存请求参数
    c# webapi websocket 服务端消息发送
    mailkit用163发邮件
    使用OPCAutomation实现对OPC数据的访问,“对 COM 组件的调用返回了错误 HRESULT E_FAIL”错误
    .net core 获取客户端ip
    C#读取OPC server
    Makedown语言常用语法
    ops:Rsync和Scp区别
    ops:Linux /bin,/sbin,/usr/sbin, /usr/local/bin区别
  • 原文地址:https://www.cnblogs.com/chch213/p/8320295.html
Copyright © 2020-2023  润新知