-
java 线程实现方式
2017-03-17 17:28:30实现线程有两种方式 1,实现Runnable接口 ,2,实现Thread 其实这两种差不多,主要区别是java 不支持多继承,但可以实现多个接口,还有就是Runnable适合于资源的共享实现线程有两种方式
1,实现Runnable接口 ,2,实现Thread
其实这两种差不多,主要区别是java 不支持多继承,但可以实现多个接口,还有就是Runnable适合于资源的共享
其实还有一种实现方式 就是Callabel接口,它的类型表示从方法call()中返回值.和上面不同的就是它能返回和抛出异常
-
java多线程实现方式_JAVA多线程实现的三种方式
2021-03-05 17:18:47Java多线程实现方式主要有三种:继承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 实现线程的方式有几种方式?带有返回值的线程怎么实现?...
2021-02-12 13:57:20Java 实现线程的方式有几种方式?带有返回值的线程怎么实现?在Java线程开发中,有几种方法开启线程?假如需要得到线程返回的信息怎么办?可以实现吗?凯哥将通过源码和大家一起分享下线程怎么将返回值带回来的。一...Java 实现线程的方式有几种方式?带有返回值的线程怎么实现?
在Java线程开发中,有几种方法开启线程?假如需要得到线程返回的信息怎么办?可以实现吗?凯哥将通过源码和大家一起分享下线程怎么将返回值带回来的。
一:无返回值类型的
1:继承Thread类
2:实现Runnable接口
这两种是大家常用的,代码demo就截图吧。
1:继承Thread类的写法
定义:一个类型需要extends thread类,然后实现thread类的run方法。
编辑
2:实现Runnable接口的写法:
定义一个类,实现Runable接口,重新run方法。
New个thread对象,使用有参构造器,参数是runnable的。然后thread.start()
二:带有返回值的
3:实现Callable接口
操作步骤:
一个类实现Callable接口,重新call方法;
在调用的时候,需要使用FutureTask这个类的有参构造,然后再使用thread的有参构造。
最后调用task的get方法。
代码如下:
运行结果:
Callable返回值的源码:
我们从FutureTask这个类入手,因为返回值就是从FutureTask中获取的。来看看类关系图:
FutureTask实现了RunnableFuture接口,RunnableFuture接口继承了Future和Runnable接口。
我们看RunnableFuture这个接口的时候,发现只有一个无返回值的run方法。那么,线程返回的数据是哪个类实现的呢?其实就在FutureTask类里面。我们在来看看FuntrueTask这个类:
重新了run方法。最后,有个set result。既然有set方法。在来看看demo中task.get()方法:
Get方法就带有返回值的。
至此,实现callable接口带有返回值的原因已经找到了。
4:使用线程池创建线程
使用线程池创建的线程,可以有返回值,也可以没有返回值。使用Executory这个顶级接口来处理。
我们先来看看Executor接口的关系。如下图:
其中看到了熟悉的ThreadPoolExecutor和ScheduledThreadPoolExecutor
4.1:使用Executor创建没有返回值得线程:
说明:这里不带返回值的,其实就是调用了Runnable的run方法。
4.2:带有返回值的demo
创建一个类,实现Callable接口。如下图:
通过这个接口,我们知道是有返回值的。
三:总结
Java中实现线程有4种方式:
我们最熟悉的不带换回值的两种以及带有返回值的两种。分别是:
Thread、Runnable和Callable以及线程池
-
java多线程实现方式_java多线程实现的四种方式
2021-02-12 10:56:55java多线程实现的四种方式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空参的构造器
2、实现Runnable接口,重写run方法
不论创建多少个线程,只需要创建一个Runnable接口实现类的对象
启动线程,new Thread(Runnable接口实现类的对象).start()
创建线程调用的是Thread类Runable类型参数的构造器
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()方法
4、线程池
Executors类
-
Java多线程实现方式
2020-07-15 14:03:34好程序员Java培训分享Java多线程实现方式,Java多线程实现方式主要有三种:继承Thread类、实现Runnable接口、使用ExecutorService、Callable、Future实现有返回结果的多线程。其中前两种方式线程执行完后都没有... -
多线程的实现方式_java 多线程实现方式
2020-12-06 11:11:19多线程有三种实现方式,具体如下。继承Thread类创建线程类重写run方法,完成线程需要做的任务。创建实例调用start()启动线程继承Thread,创建线程类创建实例-启动线程实现Runnable接口创建线程类创建实现Runnable类... -
JAVA多线程实现方式
2019-04-16 23:06:21java有多种方式实现多线程,比如继承Thread类或实现Runnable接口创建无返回值的多线程、使用ExecutorService、Callable、Future实现有返回结果的多线程等,这些该具体如何实现?各有什么不同?在什么样的场景下使用... -
JAVA多线程实现方式主要有三种
2020-01-03 18:03:57JAVA多线程实现方式主要有三种:继承Thread类、实现Runnable接口、使用ExecutorService、Callable、Future实现有返回结果的多线程。其中前两种方式线程执行完后都没有返回值,只有最后一种是带返回值的。 1、继承... -
java多线程实现方式
2016-05-10 22:26:431.JAVA多线程实现方式JAVA多线程实现方式主要有三种:继承Thread类、实现Runnable接口、使用ExecutorService、Callable、Future实现有返回结果的多线程。其中前两种方式线程执行完后都没有返回值,只有最后一种是带... -
Java线程实现
2019-06-09 18:26:02线程:线程是程序执行的小单位,一个进程可由一个或多个线程组成Java线程实现的方式一共有四种,主要提供了两种实现线程的方式:1、继承Thread类创建线程类;2、实现Runnable接口创建线程类。继承Thread类创建线程... -
java实现线程的方式_java多线程实现的四种方式
2021-02-12 10:37:14java多线程实现的四种方式1、继承Thread类,重写run方法(其实Thread类本身也实现了Runnable接口)2、实现Runnable接口,重写run方法3、实现Callable接口,重写call方法(有返回值)4、使用线程池(有返回值)1、继承... -
Java 线程的实现方式
2017-10-06 09:45:00JAVA多线程实现方式主要有三种:继承Thread类、实现Runnable接口、使用ExecutorService、Callable、Future实现有返回结果的多线程。其中前两种方式线程执行完后都没有返回值,只有最后一种是带返回值的。1、继承... -
java多线程的实现_Java多线程实现的三种方式
2021-02-12 10:01:26一、Java 多线程实现方式java中实现多线程的方式有三种,接下来我将会逐个进行介绍。1.继承Thread类继承Thread类是Java中比较常见,也是很基础的一种实现Java多线程的方式。实现的方式也比较简单,只要将需要实现多... -
Java 实现线程的方式有几种方式?带有返回值的线程怎么实现?
2020-03-11 15:00:10Java 实现线程的方式有几种方式?带有返回值的线程怎么实现? 在Java线程开发中,有几种方法开启线程?假如需要得到线程返回的信息怎么办?可以实现吗?凯哥将通过源码和大家一起分享下线程怎么将返回值带回来的。 ... -
java面试笔记五:线程、进程、以及协程,java多线程实现方式,java线程常见状态
2020-03-13 23:14:24文章目录java面试笔记五:线程、进程、以及协程进程、线程、协程并发和并行java实现多线程有几种方式?有什么不同?java线程常见的基本状态 进程、线程、协程 线程,协程,进程的关系 进程:本质上是一个独立执行... -
Java多线程实现方式主要有三种
2016-10-10 13:08:34Java多线程实现方式主要有三种:继承Thread类、实现Runnable接口、使用ExecutorService、Callable、Future实现有返回结果的多线程。其中前两种方式线程执行完后都没有返回值,只有最后一种是带返回值的。 1... -
JAVA 多线程实现方式
2018-10-12 15:07:41一般实现得方式有俩种: 实现Runnable接口。该接口中的方法run(),来实现创建线程。 继承Thread类。 这俩种实现线程得方式对比而言: 一个Thread对象只能创建一个线程,即使它调用多次的.start()也会只运行一个... -
Java线程实现的三种方式
2017-03-01 15:44:09Java多线程实现方式主要有三种:继承Thread类、实现Runnable接口、使用ExecutorService、Callable、Future实现有返回结果的多线程。其中前两种方式线程执行完后都没有返回值,只有最后一种是带返回值的。 1、继承... -
java线程的实现方法_Java多线程的四种实现方式
2021-02-12 14:13:531.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线程实现方式:Runnable和Thread的区别
2016-02-19 23:02:25在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口; Thread是java.lang包中类,Runnable是java.lang包中的接口。 方法一:继承Thread类 package com.hundsun.test; public class ...