精华内容
下载资源
问答
  • java 线程实现方式

    2017-03-17 17:28:30
    实现线程有两种方式 1,实现Runnable接口 ,2,实现Thread  其实这两种差不多,主要区别是java 不支持多继承,但可以实现多个接口,还有就是Runnable适合于资源的共享

    实现线程有两种方式

    1,实现Runnable接口 ,2,实现Thread

      其实这两种差不多,主要区别是java 不支持多继承,但可以实现多个接口,还有就是Runnable适合于资源的共享



     其实还有一种实现方式 就是Callabel接口,它的类型表示从方法call()中返回值.和上面不同的就是它能返回和抛出异常

    展开全文
  • Java线程实现方式主要三种:继承Thread类、实现Runnable接口、使用ExecutorService、Callable、Future实现返回结果的多线程。其中前两种方式线程执行完后都没有返回值,只有最后一种是带返回值的。1、继承...

    Java多线程实现方式主要有三种:继承Thread类、实现Runnable接口、使用ExecutorService、Callable、Future实现有返回结果的多线程。其中前两种方式线程执行完后都没有返回值,只有最后一种是带返回值的。

    1、继承Thread类实现多线程

    继承Thread类的方法尽管被我列为一种多线程实现方式,但Thread本质上也是实现了Runnable接口的一个实例,它代表一个线程的实例,并且,启动线程的唯一方法就是通过Thread类的start()实例方法。start()方法是一个native方法,它将启动一个新线程,并执行run()方法。这种方式实现多线程很简单,通过自己的类直接extend Thread,并复写run()方法,就可以启动新线程并执行自己定义的run()方法。例如:

    public class MyThread extendsThread {public voidrun() {

    System.out.println("MyThread.run()");

    }

    }

    在合适的地方启动线程如下:

    MyThread myThread1 = newMyThread();

    MyThread myThread2= newMyThread();

    myThread1.start();

    myThread2.start();

    2、实现Runnable接口方式实现多线程

    如果自己的类已经extends另一个类,就无法直接extends Thread,此时,必须实现一个Runnable接口,如下:

    public class MyThread extends OtherClass implementsRunnable {public voidrun() {

    System.out.println("MyThread.run()");

    }

    }

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

    MyThread myThread = newMyThread();

    Thread thread= newThread(myThread);

    thread.start();

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

    public voidrun() {if (target != null) {

    target.run();

    }

    }

    3、使用ExecutorService、Callable、Future实现有返回结果的多线程

    ExecutorService、Callable、Future这个对象实际上都是属于Executor框架中的功能类。想要详细了解Executor框架的可以访问http://www.javaeye.com/topic/366591 ,这里面对该框架做了很详细的解释。返回结果的线程是在JDK1.5中引入的新特征,确实很实用,有了这种特征我就不需要再为了得到返回值而大费周折了,而且即便实现了也可能漏洞百出。

    可返回值的任务必须实现Callable接口,类似的,无返回值的任务必须Runnable接口。执行Callable任务后,可以获取一个Future的对象,在该对象上调用get就可以获取到Callable任务返回的Object了,再结合线程池接口ExecutorService就可以实现传说中有返回结果的多线程了。下面提供了一个完整的有返回结果的多线程测试例子,在JDK1.5下验证过没问题可以直接使用。代码如下:

    import java.util.concurrent.*;importjava.util.Date;importjava.util.List;importjava.util.ArrayList;/*** 有返回值的线程*/@SuppressWarnings("unchecked")public classTest {public static void main(String[] args) throwsExecutionException,

    InterruptedException {

    System.out.println("----程序开始运行----");

    Date date1= newDate();int taskSize = 5;//创建一个线程池

    ExecutorService pool =Executors.newFixedThreadPool(taskSize);//创建多个有返回值的任务

    List list = new ArrayList();for (int i = 0; i < taskSize; i++) {

    Callable c= new MyCallable(i + " ");//执行任务并获取Future对象

    Future f =pool.submit(c);//System.out.println(">>>" + f.get().toString());

    list.add(f);

    }//关闭线程池

    pool.shutdown();//获取所有并发任务的运行结果

    for(Future f : list) {//从Future对象上获取任务的返回值,并输出到控制台

    System.out.println(">>>" +f.get().toString());

    }

    Date date2= newDate();

    System.out.println("----程序结束运行----,程序运行时间【"

    + (date2.getTime() - date1.getTime()) + "毫秒】");

    }

    }class MyCallable implements Callable{privateString taskNum;

    MyCallable(String taskNum) {this.taskNum =taskNum;

    }public Object call() throwsException {

    System.out.println(">>>" + taskNum + "任务启动");

    Date dateTmp1= newDate();

    Thread.sleep(1000);

    Date dateTmp2= newDate();long time = dateTmp2.getTime() -dateTmp1.getTime();

    System.out.println(">>>" + taskNum + "任务终止");return taskNum + "任务返回运行结果,当前任务时间【" + time + "毫秒】";

    }

    }

    代码说明:

    上述代码中Executors类,提供了一系列工厂方法用于创先线程池,返回的线程池都实现了ExecutorService接口。

    public static ExecutorService newFixedThreadPool(int nThreads)

    创建固定数目线程的线程池。

    public static ExecutorService newCachedThreadPool()

    创建一个可缓存的线程池,调用execute 将重用以前构造的线程(如果线程可用)。如果现有线程没有可用的,则创建一个新线程并添加到池中。终止并从缓存中移除那些已有 60 秒钟未被使用的线程。

    public static ExecutorService newSingleThreadExecutor()

    创建一个单线程化的Executor。

    public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize)

    创建一个支持定时及周期性的任务执行的线程池,多数情况下可用来替代Timer类。

    ExecutoreService提供了submit()方法,传递一个Callable,或Runnable,返回Future。如果Executor后台线程池还没有完成Callable的计算,这调用返回Future对象的get()方法,会阻塞直到计算完成。

    转载于:http://www.cnblogs.com/yezhenhan/archive/2012/01/09/2317636.html

    展开全文
  • Java 实现线程的方式有几种方式?带有返回值的线程怎么实现?在Java线程开发中,有几种方法开启线程?假如需要得到线程返回的信息怎么办?可以实现吗?凯哥将通过源码和大家一起分享下线程怎么将返回值带回来的。一...

    Java 实现线程的方式有几种方式?带有返回值的线程怎么实现?

    在Java线程开发中,有几种方法开启线程?假如需要得到线程返回的信息怎么办?可以实现吗?凯哥将通过源码和大家一起分享下线程怎么将返回值带回来的。

    一:无返回值类型的

    1:继承Thread类

    2:实现Runnable接口

    这两种是大家常用的,代码demo就截图吧。

    1:继承Thread类的写法

    定义:一个类型需要extends thread类,然后实现thread类的run方法。

    e24504f36d0fdfac1295a704ad87ba22.png

    编辑

    2:实现Runnable接口的写法:

    定义一个类,实现Runable接口,重新run方法。

    New个thread对象,使用有参构造器,参数是runnable的。然后thread.start()

    45a056803fa61179d1b381ae812a1aa6.png

    二:带有返回值的

    3:实现Callable接口

    操作步骤:

    一个类实现Callable接口,重新call方法;

    在调用的时候,需要使用FutureTask这个类的有参构造,然后再使用thread的有参构造。

    最后调用task的get方法。

    代码如下:

    bf455008713e312498f394f31a083c3b.png

    运行结果:

    7ca353a5672715a01cc7de748f4f8772.png

    Callable返回值的源码:

    我们从FutureTask这个类入手,因为返回值就是从FutureTask中获取的。来看看类关系图:

    9506c2bb8a9b1c448fe9eafc996bf83c.png

    FutureTask实现了RunnableFuture接口,RunnableFuture接口继承了Future和Runnable接口。

    e4d24aab4851b8219ae5e651861f2629.png

    ea2cc1468a5479851eb27c5ea11a2b03.png

    我们看RunnableFuture这个接口的时候,发现只有一个无返回值的run方法。那么,线程返回的数据是哪个类实现的呢?其实就在FutureTask类里面。我们在来看看FuntrueTask这个类:

    93171c11a4a66bab27221fd77af99f64.png

    重新了run方法。最后,有个set result。既然有set方法。在来看看demo中task.get()方法:

    1ba52690dbf837edd91df02e8aef5cf7.png

    Get方法就带有返回值的。

    至此,实现callable接口带有返回值的原因已经找到了。

    4:使用线程池创建线程

    使用线程池创建的线程,可以有返回值,也可以没有返回值。使用Executory这个顶级接口来处理。

    我们先来看看Executor接口的关系。如下图:

    1d8c0ffb3b5ce2daa3417aaf94eeabcd.png

    其中看到了熟悉的ThreadPoolExecutor和ScheduledThreadPoolExecutor

    4.1:使用Executor创建没有返回值得线程:

    346a2baf6921d9110e63a900d5bd1503.png

    说明:这里不带返回值的,其实就是调用了Runnable的run方法。

    4.2:带有返回值的demo

    创建一个类,实现Callable接口。如下图:

    067f29805ff3aff1ff8b90b803dc8ec1.png

    通过这个接口,我们知道是有返回值的。

    三:总结

    Java中实现线程有4种方式:

    我们最熟悉的不带换回值的两种以及带有返回值的两种。分别是:

    Thread、Runnable和Callable以及线程池

    展开全文
  • java线程实现的四种方式1、继承Thread类,重写run方法(其实Thread类本身也实现了Runnable接口)2、实现Runnable接口,重写run方法3、实现Callable接口,重写call方法(返回值)4、使用线程池(返回值)1、继承...

    java多线程实现的四种方式1、继承Thread类,重写run方法(其实Thread类本身也实现了Runnable接口)

    2、实现Runnable接口,重写run方法

    3、实现Callable接口,重写call方法(有返回值)

    4、使用线程池(有返回值)

    1、继承Thread类,重写run方法

    每次创建一个新的线程,都要新建一个Thread子类的对象

    启动线程,new Thread子类().start()

    创建线程实际调用的是父类Thread空参的构造器a4bfa5782511eb9ab6ed2ae7c7eb6cdd.png

    2、实现Runnable接口,重写run方法

    不论创建多少个线程,只需要创建一个Runnable接口实现类的对象

    启动线程,new Thread(Runnable接口实现类的对象).start()

    创建线程调用的是Thread类Runable类型参数的构造器64bb52b1b6ccbd3569dd018e4650a1b7.png

    3、实现Callable接口,重写call方法(有返回值)

    自定义类实现Callable接口时,必须指定泛型,该泛型即返回值的类型

    每次创建一个新的线程,都要创建一个新的Callable接口的实现类、

    如何启动线程?

    (1)创建一个Callable接口的实现类的对象

    (2)创建一个FutureTask对象,传入Callable类型的参数

    public FutureTask(Callable callable){……}

    (3)调用Thread类重载的参数为Runnable的构造器创建Thread对象

    将FutureTask作为参数传递

    public class FutureTask implements RunnableFuture

    public interface RunnableFuture extends Runnable, Future

    如何获取返回值?

    调用FutureTask类的get()方法215b36d0f5e1bdd0ba03dbdfe7a81ae1.png

    4、线程池

    Executors类9b70fc17640c4eb2925fee52731e4eac.png

    4fef708b7a9c04d15b3a4b8b41e31f89.png

    展开全文
  • Java线程实现方式

    2020-07-15 14:03:34
    好程序员Java培训分享Java线程实现方式Java线程实现方式主要三种:继承Thread类、实现Runnable接口、使用ExecutorService、Callable、Future实现返回结果的多线程。其中前两种方式线程执行完后都没有...
  • 多线程三种实现方式,具体如下。继承Thread类创建线程类重写run方法,完成线程需要做的任务。创建实例调用start()启动线程继承Thread,创建线程类创建实例-启动线程实现Runnable接口创建线程类创建实现Runnable类...
  • JAVA线程实现方式

    2019-04-16 23:06:21
    java有多种方式实现线程,比如继承Thread类或实现Runnable接口创建无返回值的多线程、使用ExecutorService、Callable、Future实现有返回结果的多线程等,这些该具体如何实现?各什么不同?在什么样的场景下使用...
  • JAVA线程实现方式主要三种:继承Thread类、实现Runnable接口、使用ExecutorService、Callable、Future实现返回结果的多线程。其中前两种方式线程执行完后都没有返回值,只有最后一种是带返回值的。 1、继承...
  • java线程实现方式

    2016-05-10 22:26:43
    1.JAVA线程实现方式JAVA线程实现方式主要三种:继承Thread类、实现Runnable接口、使用ExecutorService、Callable、Future实现返回结果的多线程。其中前两种方式线程执行完后都没有返回值,只有最后一种是带...
  • Java线程实现

    2019-06-09 18:26:02
    线程:线程是程序执行的小单位,一个进程可由一个或多个线程组成Java线程实现方式一共四种,主要提供了两种实现线程的方式:1、继承Thread类创建线程类;2、实现Runnable接口创建线程类。继承Thread类创建线程...
  • java线程实现的四种方式1、继承Thread类,重写run方法(其实Thread类本身也实现了Runnable接口)2、实现Runnable接口,重写run方法3、实现Callable接口,重写call方法(返回值)4、使用线程池(返回值)1、继承...
  • Java 线程实现方式

    2017-10-06 09:45:00
    JAVA线程实现方式主要三种:继承Thread类、实现Runnable接口、使用ExecutorService、Callable、Future实现返回结果的多线程。其中前两种方式线程执行完后都没有返回值,只有最后一种是带返回值的。1、继承...
  • 一、Java线程实现方式java中实现多线程的方式有三种,接下来我将会逐个进行介绍。1.继承Thread类继承Thread类是Java中比较常见,也是很基础的一种实现Java多线程的方式。实现的方式也比较简单,只要将需要实现多...
  • Java 实现线程的方式有几种方式?带有返回值的线程怎么实现? 在Java线程开发中,有几种方法开启线程?假如需要得到线程返回的信息怎么办?可以实现吗?凯哥将通过源码和大家一起分享下线程怎么将返回值带回来的。 ...
  • 文章目录java面试笔记五:线程、进程、以及协程进程、线程、协程并发和并行java实现多线程几种方式什么不同?java线程常见的基本状态 进程、线程、协程 线程,协程,进程的关系 进程:本质上是一个独立执行...
  • Java线程实现方式主要三种:继承Thread类、实现Runnable接口、使用ExecutorService、Callable、Future实现返回结果的多线程。其中前两种方式线程执行完后都没有返回值,只有最后一种是带返回值的。 1...
  • JAVA线程实现方式

    2018-10-12 15:07:41
    一般实现方式有俩种: 实现Runnable接口。该接口中的方法run(),来实现创建线程。 继承Thread类。 这俩种实现线程得方式对比而言: 一个Thread对象只能创建一个线程,即使它调用多次的.start()也会只运行一个...
  • Java线程实现方式主要三种:继承Thread类、实现Runnable接口、使用ExecutorService、Callable、Future实现返回结果的多线程。其中前两种方式线程执行完后都没有返回值,只有最后一种是带返回值的。 1、继承...
  • 1.Java线程实现方式有四种:1.继承Thread类,重写run方法2.实现Runnable接口,重写run方法,实现Runnable接口的实现类的实例对象作为Thread构造函数的target3.通过Callable和FutureTask创建线程4.通过线程池创建...
  • Java 线程实现

    2019-09-24 21:35:56
    创建和启动线程,传统两种方式 : 方式1 : 继承 Thread 类 ; 方式2 : 实现Runnable 接口 ; 方式1 : 定义一个类 A 继承与 java.lang.Thread类 在 A 类中覆盖Thread类的 run 方法 我们在 run 方法中编写需要...
  • java中可两种方式实现线程,一种是继承Thread类,一种是实现Runnable接口; Thread是java.lang包中类,Runnable是java.lang包中的接口。 方法一:继承Thread类 package com.hundsun.test; public class ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 9,116
精华内容 3,646
关键字:

java线程实现方式有

java 订阅