热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

多线程的几个方法

为什么80%的码农都做不了架构师?packageapiDemo;importjava.util.Random;importjava.util.concurre

为什么80%的码农都做不了架构师?>>>   hot3.png

package apiDemo;import java.util.Random;
import java.util.concurrent.*;/*** anyou*/
public class newDemo {/*** 让两个线程依次执行*/private static void demo1(){Thread A &#61; new Thread(new Runnable() {&#64;Overridepublic void run() {printNumber("A");}});Thread B &#61; new Thread(new Runnable() {&#64;Overridepublic void run() {printNumber("B");}});A.start();B.start();}/*** 结果&#xff1a;* Bprint1Aprint1Aprint2Bprint2Bprint3Aprint3*//*** B在A执行完之后再执行*/private static void demo2(){final Thread A &#61; new Thread(new Runnable() {&#64;Overridepublic void run() {printNumber("A");}});Thread B &#61; new Thread(new Runnable() {&#64;Overridepublic void run() {System.out.println("B 开始等待 A");try {A.join();} catch (InterruptedException e) {e.printStackTrace();}printNumber("B");}});B.start();A.start();}/*** 结果&#xff1a;* B 开始等待 AAprint1Aprint2Aprint3Bprint1Bprint2Bprint3*//*** A和B交叉运行*/private static void demo3(){final Object lock &#61; new Object();Thread A &#61; new Thread(new Runnable() {&#64;Overridepublic void run() {synchronized (lock) {System.out.println("A 1");try {System.out.println("A is waiting!");lock.wait();} catch (InterruptedException e) {e.printStackTrace();}System.out.println("A 2");System.out.println("A 3");}}});Thread B &#61; new Thread(new Runnable() {&#64;Overridepublic void run() {synchronized (lock) {System.out.println("B 1");System.out.println("B 2");System.out.println("B 3");lock.notify();}}});A.start();B.start();}/*** 结果&#xff1a;* A 1A is waiting!B 1B 2B 3A 2A 3*//*** 四个线程 A B C D&#xff0c;其中 D 要等到 A B C 全执行完毕后才执行&#xff0c;而且 A B C 是同步运行的*/private static void runDAfterABC(){int worker &#61; 3;final CountDownLatch countDownLatch &#61; new CountDownLatch(worker);new Thread(new Runnable() {&#64;Overridepublic void run() {System.out.println("D is waiting for other three threads!");try {countDownLatch.await();System.out.println("All done, D starts working");} catch (InterruptedException e) {e.printStackTrace();}}}).start();for (char threadName &#61; &#39;A&#39;; threadName <&#61; &#39;C&#39;; threadName &#43;&#43;){final String tN &#61; String.valueOf(threadName);new Thread(new Runnable() {&#64;Overridepublic void run() {System.out.println(tN &#43;" is working");try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(tN &#43; " finished");countDownLatch.countDown();}}).start();}}/*** 结果&#xff1a;* D is waiting for other three threads!A is workingB is workingC is workingA finishedB finishedC finishedAll done, D starts working*//*** 三个运动员各自准备&#xff0c;等到三个人都准备好后&#xff0c;再一起跑*/private static void runABCWhenAllReady(){int runner &#61; 3;final CyclicBarrier cyclicBarrier &#61; new CyclicBarrier(runner);final Random random &#61; new Random();for (char runnerName &#61; &#39;A&#39;; runnerName <&#61; &#39;C&#39;;runnerName&#43;&#43;){final String rN &#61; String.valueOf(runnerName);new Thread(new Runnable() {&#64;Overridepublic void run() {long prepareTime &#61; random.nextInt(10000) &#43; 100;System.out.println(rN &#43; " is preparing for time: "&#43;prepareTime);try {Thread.sleep(prepareTime);} catch (InterruptedException e) {e.printStackTrace();}try {System.out.println(rN &#43; "is prepared, waiting for others");cyclicBarrier.await();} catch (InterruptedException e) {e.printStackTrace();} catch (BrokenBarrierException e) {e.printStackTrace();}System.out.println(rN &#43; "starts running");}}).start();}}/*** 结果&#xff1a;* A is preparing for time: 5592B is preparing for time: 2906C is preparing for time: 5513Bis prepared, waiting for othersCis prepared, waiting for othersAis prepared, waiting for othersAstarts runningBstarts runningCstarts running*//*** 子线程完成某件任务后&#xff0c;把得到的结果回传给主线程*/private static void doTaskWithResultInWorker(){Callable callable &#61; new Callable() {&#64;Overridepublic Integer call() throws Exception {System.out.println("Task starts");Thread.sleep(1000);int result &#61; 0;for (int i&#61;0;i<&#61;100;i&#43;&#43;){result &#43;&#61; 1;}System.out.println("Task finished and return result");return result;}};FutureTask futureTask &#61; new FutureTask(callable);new Thread(futureTask).start();try {System.out.println("Before futureTask.get()");System.out.println("Result: "&#43; futureTask.get());System.out.println("After futureTask.get()");} catch (InterruptedException e) {e.printStackTrace();} catch (ExecutionException e) {e.printStackTrace();}}/*** 结果&#xff1a;* Before futureTask.get()Task startsTask finished and return resultResult: 101After futureTask.get()*//*** 将目标字符串打印出来* &#64;param threadName*/private static void printNumber(String threadName){int i &#61; 0;while (i&#43;&#43; <3){try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(threadName &#43; "print" &#43; i);}}public static void main(String[] args) {
// demo1();
// demo2();
// demo3();
// runDAfterABC();
// runABCWhenAllReady();doTaskWithResultInWorker();}
}

 


转:https://my.oschina.net/ayo123/blog/1572808



推荐阅读
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
  • Java中包装类的设计原因以及操作方法
    本文主要介绍了Java中设计包装类的原因以及操作方法。在Java中,除了对象类型,还有八大基本类型,为了将基本类型转换成对象,Java引入了包装类。文章通过介绍包装类的定义和实现,解答了为什么需要包装类的问题,并提供了简单易用的操作方法。通过本文的学习,读者可以更好地理解和应用Java中的包装类。 ... [详细]
  • Java自带的观察者模式及实现方法详解
    本文介绍了Java自带的观察者模式,包括Observer和Observable对象的定义和使用方法。通过添加观察者和设置内部标志位,当被观察者中的事件发生变化时,通知观察者对象并执行相应的操作。实现观察者模式非常简单,只需继承Observable类和实现Observer接口即可。详情请参考Java官方api文档。 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
  • Whatsthedifferencebetweento_aandto_ary?to_a和to_ary有什么区别? ... [详细]
  • Android系统源码分析Zygote和SystemServer启动过程详解
    本文详细解析了Android系统源码中Zygote和SystemServer的启动过程。首先介绍了系统framework层启动的内容,帮助理解四大组件的启动和管理过程。接着介绍了AMS、PMS等系统服务的作用和调用方式。然后详细分析了Zygote的启动过程,解释了Zygote在Android启动过程中的决定作用。最后通过时序图展示了整个过程。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文介绍了Java中Hashtable的clear()方法,该方法用于清除和移除指定Hashtable中的所有键。通过示例程序演示了clear()方法的使用。 ... [详细]
author-avatar
不如藏拙_487
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有