•   欢迎来到21NN网.
  •   请记住本站网址www.21nn.cn

Java中建立线程的3种方法引见(代码)【JAVA教程】,Java

摘要: 本篇文章给人人带来的内容是关于Java中建立线程的3种要领引见(代码),有肯定的参考价值,有须要的朋侪能够参考一下,愿望对你有所协助。在java中假如要建立线程的话,平常有3种要领:...
本篇文章给人人带来的内容是关于Java中建立线程的3种要领引见(代码),有肯定的参考价值,有须要的朋侪能够参考一下,愿望对你有所协助。

在java中假如要建立线程的话,平常有3种要领:

  1. 继续Thread类;

  2. 完成Runnable接口;

  3. 运用Callable和Future建立线程。

1. 继续Thread类

继续Thread类的话,必需重写run要领,在run要领中定义须要实行的使命。

class MyThread extends Thread{
    private static int num = 0;
     
    public MyThread(){
        num++;
    }
     
    @Override
    public void run() {
        System.out.println("主动建立的第"+num+"个线程");
    }
}

建立好了本身的线程类以后,就能够建立线程对象了,然后经由历程start()要领去启动线程。注重,不是挪用run()要领启动线程,run要领中只是定义须要实行的使命,假如挪用run要领,即相当于在主线程中实行run要领,跟一般的要领挪用没有任何区分,此时并不会建立一个新的线程来实行定义的使命。

public class Test {
    public static void main(String[] args)  {
        MyThread thread = new MyThread();
        thread.start();
    }
}
 
 
class MyThread extends Thread{
    private static int num = 0;
     
    public MyThread(){
        num++;
    }
     
    @Override
    public void run() {
        System.out.println("主动建立的第"+num+"个线程");
    }
}

在上面代码中,经由历程挪用start()要领,就会建立一个新的线程了。为了分清start()要领挪用和run()要领挪用的区分,请看下面一个例子:

public class Test {
    public static void main(String[] args)  {
        System.out.println("主线程ID:"+Thread.currentThread().getId());
        MyThread thread1 = new MyThread("thread1");
        thread1.start();
        MyThread thread2 = new MyThread("thread2");
        thread2.run();
    }
}
 
 
class MyThread extends Thread{
    private String name;
     
    public MyThread(String name){
        this.name = name;
    }
     
    @Override
    public void run() {
        System.out.println("name:"+name+" 子线程ID:"+Thread.currentThread().getId());
    }
}

运转效果:

从输出效果能够得出以下结论:

1)thread1和thread2的线程ID差异,thread2和主线程ID雷同,申明经由历程run要领挪用并不会建立新的线程,而是在主线程中直接运转run要领,跟一般的要领挪用没有任何区分;

2)虽然thread1的start要领挪用在thread2的run要领前面挪用,然则先输出的是thread2的run要领挪用的相干信息,申明新线程建立的历程不会壅塞主线程的后续实行。

2. 完成Runnable接口

在Java中建立线程除了继续Thread类以外,还能够经由历程完成Runnable接口来完成相似的功用。完成Runnable接口必需重写其run要领。

下面是一个例子:

public class Test {
    public static void main(String[] args)  {
        System.out.println("主线程ID:"+Thread.currentThread().getId());
        MyRunnable runnable = new MyRunnable();
        Thread thread = new Thread(runnable);
        thread.start();
    }
}
 
 
class MyRunnable implements Runnable{
     
    public MyRunnable() {
         
    }
     
    @Override
    public void run() {
        System.out.println("子线程ID:"+Thread.currentThread().getId());
    }
}

Runnable的中文意义是“使命”,望文生义,经由历程完成Runnable接口,我们定义了一个子使命,然后将子使命交由Thread去实行。注重,这类体式格局必需将Runnable作为Thread类的参数,然后经由历程Thread的start要领来建立一个新线程来实行该子使命。假如挪用Runnable的run要领的话,是不会建立新线程的,这根一般的要领挪用没有任何区分。

事实上,检察Thread类的完成源代码会发明Thread类是完成了Runnable接口的。

在Java中,这2种体式格局都能够用来建立线程去实行子使命,细致挑选哪种体式格局要看本身的需求。直接继续Thread类的话,能够比完成Runnable接口看起来越发简约,然则由于Java只允许单继续,所以假如自定义类须要继续其他类,则只能挑选完成Runnable接口。

3. 运用Callable和Future建立线程

和Runnable接口不一样,Callable接口供应了一个call()要领作为线程实行体,call()要领比run()要领功用要壮大。

建立并启动有返回值的线程的步骤以下:

  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();

   }

  }

}

三种建立线程体式格局对照:

完成Runnable和完成Callable接口的体式格局基础雷同,不过是后者实行call()要领有返回值,后者线程实行体run()要领无返回值,因而能够把这两种体式格局归为一种这类体式格局与继续Thread类的要领之间的差异以下:

  1. 线程只是完成Runnable或完成Callable接口,还能够继续其他类。

  2. 这类体式格局下,多个线程能够同享一个target对象,异常合适多线程处置惩罚统一份资本的情况。

  3. 然则编程轻微庞杂,假如须要接见当前线程,必需挪用Thread.currentThread()要领。

  4. 继续Thread类的线程类不能再继续其他父类(Java单继续决议)。

PS:平常引荐采纳完成接口的体式格局来建立多线程

以上就是Java中建立线程的3种要领引见(代码)的细致内容,更多请关注ki4网别的相干文章!

分享到:

发表评论

评论列表

还没有评论,快来说点什么吧~

公众号二维码

微信公众号