关于线程你需要了解的

作者: 行者_zm | 来源:发表于2018-12-26 07:45 被阅读21次

java中创建线程的三种方法以及区别:

三种创建线程方法对比

实现Runnable和实现Callable接口的方式基本相同,不过是后者执行call()方法有返回值,后者线程执行体run()方法无返回值,因此可以把这两种方式归为一种这种方式与继承Thread类的方法之间的差别如下:
1、线程只是实现Runnable或实现Callable接口,还可以继承其他类。
2、这种方式下,多个线程可以共享一个target对象,非常适合多线程处理同一份资源的情形。
3、但是编程稍微复杂,如果需要访问当前线程,必须调用Thread.currentThread()方法。
4、继承Thread类的线程类不能再继承其他父类(Java单继承决定)。

==注:一般推荐采用实现接口的方式来创建多线程==

下面是三种方法的表述:

1、继承Thread类创建线程类

(1)定义Thread类的子类,并重写该类的run方法,该run方法的方法体就代表了线程要完成的任务。因此把run()方法称为执行体。

(2)创建Thread子类的实例,即创建了线程对象。

(3)调用线程对象的start()方法来启动该线程。

public class MyThread extends Thread{//继承Thread类
  public void run(){
  //重写run方法
  }
}
public class Main {
  public static void main(String[] args){
    new MyThread().start();//创建并启动线程
  }
}

2、通过Runnable接口创建线程类

(1)定义runnable接口的实现类,并重写该接口的run()方法,该run()方法的方法体同样是该线程的线程执行体。

(2)创建 Runnable实现类的实例,并以此实例作为Thread的target来创建Thread对象,该Thread对象才是真正的线程对象。

(3)调用线程对象的start()方法来启动该线程。

线程的执行流程很简单,当执行代码start()时,就会执行对象中重写的void run();方法,该方法执行完成后,线程就消亡了。

public class MyThread2 implements Runnable {//实现Runnable接口

  public void run(){

  //重写run方法

  }

}

public class Main {

  public static void main(String[] args){

    //创建并启动线程

    MyThread2 myThread=new MyThread2();

    Thread thread=new Thread(myThread);

    thread().start();

    //或者    new Thread(new MyThread2()).start();

  }

}

3、通过Callable和Future创建线程

(1)创建Callable接口的实现类,并实现call()方法,该call()方法将作为线程执行体,并且有返回值。

public interface Callable
{
  V call() throws Exception;
}

(2)创建Callable实现类的实例,使用FutureTask类来包装Callable对象,该FutureTask对象封装了该Callable对象的call()方法的返回值。(FutureTask是一个包装器,它通过接受Callable来创建,它同时实现了Future和Runnable接口。)

(3)使用FutureTask对象作为Thread对象的target创建并启动新线程。

(4)调用FutureTask对象的get()方法来获得子线程执行结束后的返回值

介绍了相关的概念之后,创建并启动有返回值的线程的步骤如下:

1】创建Callable接口的实现类,并实现call()方法,然后创建该实现类的实例(从java8开始可以直接使用Lambda表达式创建Callable对象)。

2】使用FutureTask类来包装Callable对象,该FutureTask对象封装了Callable对象的call()方法的返回值

3】使用FutureTask对象作为Thread对象的target创建并启动线程(因为FutureTask实现了Runnable接口)

4】调用FutureTask对象的get()方法来获得子线程执行结束后的返回值

public class Main {

  public static void main(String[] args){

   MyThread3 th=new MyThread3();

   //使用Lambda表达式创建Callable对象

     //使用FutureTask类来包装Callable对象

   FutureTask<Integer> future=new FutureTask<Integer>(

    (Callable<Integer>)()->{
      return 5;
    }

    );

   new Thread(task,"有返回值的线程").start();//实质上还是以Callable对象来创建并启动线程

    try{

    System.out.println("子线程的返回值:"+future.get());//get()方法会阻塞,直到子线程执行结束才返回

    }catch(Exception e){

    ex.printStackTrace();

   }

  }

}

相关文章

  • 关于线程你需要了解的

    java中创建线程的三种方法以及区别: 三种创建线程方法对比 实现Runnable和实现Callable接口的方式...

  • 关于线程池需要了解的事情

    Java线程池的优点: 1、降低资源消耗 通过重复利用已创建的线程降低线程创建和销毁的消耗。2、提高响应速度 当...

  • [iOS] OC中的锁

    为了解决线程同步问题,需要使用线程锁 @synchronized. ...

  • 线程通信的方法

    线程通信的方法 程序在使用多线程执行任务时,经常需要线程之间协同工作。此时,我们需要了解线程通信的手段。 线程通信...

  • ios 多线程你需要了解的

    了解多线程之前首先要了解一下几个概念 进程 进程是指在系统中正在进行的一个应用程序;每个进程之间是独立的,每个进程...

  • Java死锁

    了解死锁之前,我们要先了解线程的状态,或者叫线程的生命周期。 线程的状态主要分为上图中的这几种状态,这里我们需要注...

  • iOS线程锁的研究

    iOS线程锁的研究 在开始说线程锁之前,我们需要了解线程的概念。 什么是线程 线程,有时被称为轻量级进程(LWP)...

  • Java 多线程

    1 多线程 1.1 多线程介绍   学习多线程之前,我们先要了解几个关于多线程有关的概念。  进程:进程指正在运行...

  • 关于多线程网络,你了解多少?

    1. 多线程的底层实现 (1)首先什么是线程 1个进程要想执行任务,必须得有线程.线程是进程的基本执行单元,一个进...

  • Android线程池得要这么用

    背景 之前写了两篇关于线程和多线程的文章,竟然写到了多线程,那肯定少不了线程池啊,如果想了解线程和线程池方面的知识...

网友评论

    本文标题:关于线程你需要了解的

    本文链接:https://www.haomeiwen.com/subject/mjpakqtx.html