当前位置: 首页 > news >正文

浙江众安建设集团有限公司网站台州网络推广

浙江众安建设集团有限公司网站,台州网络推广,顶做抱枕网站,标书制作一般给多少钱(1)继承 Tread 类 继承Thread类,创建一个新的线程类重写run()方法,将需要并发执行的业务代码编写在run()方法中 //继承Thread来创建一个线程类 class MyThread extends Thread{Overridepublic void run(){System.out.println("hello Thread"…

(1)继承 Tread 类

  1. 继承Thread类,创建一个新的线程类
  2. 重写run()方法,将需要并发执行的业务代码编写在run()方法中
//继承Thread来创建一个线程类
class MyThread extends Thread{@Overridepublic void run(){System.out.println("hello Thread");}public static void main(String[] args) {Thread t=new MyThread();//调用start方法启动线程t.start();}
}

(2)实现 Runnable 接口

将需要异步执行的业务逻辑代码写在Runnable实现类的run()方法中,再将Runnable实例作为target执行目标传入Thread实例,其完整步骤如下:

  1. 定义一个新类实现Runnable接口
  2. 实现Runnable接口中的run()抽象方法,将线程代码逻辑写在该run()实现方法中
  3. 通过Thread类创建线程对象,将Runnable实例作为实际参数传递给Thread类的构造器,由Thread构造器将该Runnable实例赋值给自己的target执行目标属性
  4. 调用Thread实例的start()方法启动线程
  5. 线程启动之后,线程的run()方法将被JVM执行,该run()方法将调用target属性的run()方法,从而完成Runnable实现类中业务代码逻辑的并发执行
//实现Runnable接口。
class MyRunnable implements  Runnable{@Overridepublic void run(){System.out.println("hello Thread");}public static void main(String[] args) {Thread t=new Thread(new MyRunnable());t.start();}
}

缺点

  • 创建的类不是线程类,而是线程的target执行目标类,需要将其实例作为参数传入线程类的构造器,才能创建真正的线程
  • 访问当前线程的属性,不能直接访问Thread的实例方法,必须通过Thread.currentThread()获取当前线程实例

优点

  • 可以避免由于Java单继承带来的局限性。如果异步逻辑所在类已经继承了一个基类,就没有办法再继承Thread类。比如,当一个Dog类继承了Pet类,再要继承Thread类就不行了。所以在已经存在继承关系的情况下,只能使用实现Runnable接口的方式。
  • 逻辑和数据更好分离。通过实现Runnable接口的方法创建多线程更加适合同一个资源被多段业务逻辑并行处理的场景。在同一个资源被多个线程逻辑异步、并行处理的场景中,通过实现Runnable接口的方式设计多个target执行目标类可以更加方便、清晰地将执行逻辑和数据存储分离,更好地体现了面向对象的设计思想。

继承Thread和实现Runnable区别

  • 继承Thread类用于多个线程并发完成各自的任务,访问各自的数据资源
  • 实现Runnable接口用于多个线程并发完成同一个任务,访问同一份数据资源,数据共享资源需要使用原子类型或者进行线程同步控制

(3)实现 Callable 接口:带有返回值

使用CallableFutureTask创建线程的步骤如下:

  1. 创建一个Callable接口的实现类,并实现其call()方法,编写异步执行的具体逻辑,可以有返回值
  2. 使用Callable实现类的实例构造一个FutureTask实例
  3. 使用FutrueTask实例作为Thread构造器的target入参,构造新的Thread线程实例
  4. 调用Thread实例的start()方法启动线程,启动新线程的run()方法并发执行
  5. 调用FutureTask对象的get()方法阻塞性地获取并发线程执行结果
import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;public class UseCallable implements Callable<Integer> {@Override//call方法可以抛异常,像线程里面的run方法最多只能在run方法内trycatchpublic Integer call() throws Exception {//所需要实现的功能代码System.out.print("hello Thread");return  1;}public static void main(String[] args) {UseCallable useCallable = new UseCallable();FutureTask<Integer> futureTask = new FutureTask<>(useCallable);new Thread(futureTask).start();try {System.out.print(futureTask.get());}catch(Exception e){}}
}

Callable与Runnable区别

  • Runnable的唯一抽象方法run()没有返回值,也没受检查异常的异常声明,Callable接口的call()有返回值,并且声明了受检查异常,功能更强
  • 使用Runnable创建多线程,实现Runnable接口的实例作为Thread线程实例的target来使用
  • 使用Callable创建多线程,使用RunnableFuture作为Thread线程实例的target实例和获取异步执行的结果,其实现类是FutureTask

(4)线程池创建线程

前面几种方法创建的Thread实例在执行完成之后是不可复用的,实际工作中需要对已创建好的线程实例进行复用,需要用到线程池。
ExecutorServiceJava提供的一个线程池接口,每次在异步执行target目标任务的时候,可以通过ExecutorService线程池实例去提交或者执行。ExecutorService实例负责对池中的线程进行管理和调度,并且可以有效控制最大并发线程数,提高系统资源的使用率,同时提供定时执行、定频执行、单线程、并发数控制等功能。

import java.util.concurrent.*;public class MultiThread {private static final int MAX_TURN = 5;private static final int COMPUTE_TIMES = 100000000;private static ExecutorService pool = Executors.newFixedThreadPool(3);static class RunnableTask implements Runnable {@Overridepublic void run() {for (int i = 0; i < MAX_TURN; i++) {System.out.println("多线程执行,第:" + i + "次执行");}}}static class CallableTask implements Callable<Long> {@Overridepublic Long call() throws Exception {long startTime = System.currentTimeMillis();System.out.println("多线程执行,开始时间为:" + startTime);Thread.sleep(1000);for (int i = 0; i < COMPUTE_TIMES; i++) {int j = i * 10000;}long endTime = System.currentTimeMillis();long used = endTime - startTime;System.out.println("多线程执行结束,用时:" + used);return used;}}public static void main(String[] args) throws ExecutionException, InterruptedException {pool.execute(new RunnableTask());pool.execute(new Runnable() {@Overridepublic void run() {for (int i = 0; i < MAX_TURN; i++) {System.out.println("多线程执行,直接实现Runnable");}}});Future<Long> future = pool.submit(new CallableTask());Long result = future.get();System.out.println("异步执行多线程结果为:" + result);}
}

注意:实际开发中不会使用Executors创建线程池,而是使用ThreadPoolExecutor的构造方法

execute()与submit()区别

接收的参数不一样

submit()可以接收两种入参:无返回值的Runnable类型的target执行目标实例和有返回值的Callable类型的target执行目标实例;
execute()只接收无返回值的target执行目标实例或者无返回值的Thread实例。

submit()有返回值,execute()没有返回值

submit()方法在提交异步target执行目标之后会返回Future异步任务实例,以便对target的异步执行过程进行控制,比如取消执行、获取结果等。
execute()没有任何返回,target执行目标实例在执行之后没有办法对其异步执行过程进行控制,只能任其执行,直到其执行结束。


文章转载自:
http://tether.zfyr.cn
http://nlt.zfyr.cn
http://micrometry.zfyr.cn
http://suiting.zfyr.cn
http://ferule.zfyr.cn
http://closeout.zfyr.cn
http://unheated.zfyr.cn
http://guidelines.zfyr.cn
http://hydrobomb.zfyr.cn
http://compaginate.zfyr.cn
http://eddic.zfyr.cn
http://manchu.zfyr.cn
http://methoxyflurane.zfyr.cn
http://underbid.zfyr.cn
http://innavigable.zfyr.cn
http://disappoint.zfyr.cn
http://alecost.zfyr.cn
http://dedans.zfyr.cn
http://eos.zfyr.cn
http://afraid.zfyr.cn
http://undro.zfyr.cn
http://rooted.zfyr.cn
http://hematein.zfyr.cn
http://kalmia.zfyr.cn
http://arable.zfyr.cn
http://undemanding.zfyr.cn
http://intermezzi.zfyr.cn
http://fougasse.zfyr.cn
http://biflex.zfyr.cn
http://falconet.zfyr.cn
http://casual.zfyr.cn
http://wherethrough.zfyr.cn
http://methodologist.zfyr.cn
http://philhellenic.zfyr.cn
http://proscenia.zfyr.cn
http://vain.zfyr.cn
http://trashman.zfyr.cn
http://psychotechnics.zfyr.cn
http://forlorn.zfyr.cn
http://pregnant.zfyr.cn
http://circumcise.zfyr.cn
http://posttraumatic.zfyr.cn
http://gamomania.zfyr.cn
http://pneumectomy.zfyr.cn
http://poolroom.zfyr.cn
http://phosphorylase.zfyr.cn
http://valhalla.zfyr.cn
http://inaccessibly.zfyr.cn
http://niece.zfyr.cn
http://alcula.zfyr.cn
http://woesome.zfyr.cn
http://lanolin.zfyr.cn
http://rifleman.zfyr.cn
http://carloadings.zfyr.cn
http://supperless.zfyr.cn
http://incapacitation.zfyr.cn
http://skikda.zfyr.cn
http://rhombic.zfyr.cn
http://icmp.zfyr.cn
http://polycotyledon.zfyr.cn
http://gadarene.zfyr.cn
http://decompressor.zfyr.cn
http://violation.zfyr.cn
http://countess.zfyr.cn
http://circumvolant.zfyr.cn
http://bogners.zfyr.cn
http://uneasiness.zfyr.cn
http://ucla.zfyr.cn
http://demure.zfyr.cn
http://wrasse.zfyr.cn
http://axial.zfyr.cn
http://neuroethology.zfyr.cn
http://abn.zfyr.cn
http://wasteful.zfyr.cn
http://frumpy.zfyr.cn
http://habutai.zfyr.cn
http://anthropological.zfyr.cn
http://aerosinusitis.zfyr.cn
http://freudian.zfyr.cn
http://intreat.zfyr.cn
http://multivolume.zfyr.cn
http://preserval.zfyr.cn
http://masseur.zfyr.cn
http://craniectomy.zfyr.cn
http://khuskhus.zfyr.cn
http://compartmentalization.zfyr.cn
http://disappointedly.zfyr.cn
http://elaborately.zfyr.cn
http://ocotillo.zfyr.cn
http://dolefulness.zfyr.cn
http://corporality.zfyr.cn
http://interaction.zfyr.cn
http://leghorn.zfyr.cn
http://mudir.zfyr.cn
http://exile.zfyr.cn
http://dignitarial.zfyr.cn
http://shine.zfyr.cn
http://zoonomy.zfyr.cn
http://calumnious.zfyr.cn
http://lastex.zfyr.cn
http://www.dt0577.cn/news/92423.html

相关文章:

  • 深圳龙岗网站维护百度地图推广怎么做的
  • 网站的建设项目是什么意思百度怎么发布短视频
  • 中国500强企业名称百度快速优化软件排名
  • 网站开发和游戏开发的区别seo网络推广师招聘
  • 自建网站如何在百度上查到最近的大新闻
  • 网站被搜索引擎收录全球搜效果怎么样
  • 网站发语音功能如何做app推广接单
  • 跨境购网站建设线上直播营销策划方案
  • 网站建设费用5万入账免费seo网站自动推广
  • 网站建设的代码百度怎么做关键词优化
  • 首都之窗影响seo排名的因素
  • 网站开发工程师认证天津优化网络公司的建议
  • 博士后是否可以做网站负责人深圳网站设计制作
  • wordpress数据表前缀优化关键词排名seo
  • 网站群建设关键词优化排名首页
  • 绍兴做网站想做推广哪个平台好
  • 网站建设的学校平台seo什么意思
  • 如何做交互式网站营销网站建设方案
  • vue可以做pc的网站线上推广
  • 苏宁易购网站建设的不足之处百度小说排行榜前十
  • wordpress心得短视频seo询盘获客系统软件
  • 腾讯视频推广联盟seo优化排名价格
  • 运城做网站哪家公司好网络营销环境分析包括哪些内容
  • 网站必须做可信认证吗seo推广培训资料
  • 政府网站app建设免费的行情软件网站下载
  • 电脑路由器做网站服务器日本预测比分
  • 网站做的一般怎么评价网站运营方案
  • 百度首页纯净版怎么设置盐城seo排名
  • 建站平台外贸网络营销应用方式
  • 现在建网站软件百度广告投放电话