一 问题概述

线程或者进程之间有两种关系 同步和互斥,我们通常实现同步方法是使用线程的等待唤醒机制,而等待唤醒机制的使用是建立在互斥的继承上的。但是同步线程并不一定是必须要实现互斥的。比如一个线程打印A,一个线程打印B。这两个线程就没有互斥关系,但是提出这么个需求:交替打印A、B 。我们一般的解决方案,往往要使用wait()/notify机制。

二 LockSupport 介绍

LockSupport作为一个工具类,主要学习它的方法。

park():在线程内调用,表示当前线程自我阻塞,直到获得许可证

park(线程变量):让指定的线程获得许可证。

一看这两个方法的定义,显然可以利用这两个方法实现线程的顺序调用(同步)

三 两种思路实现交替打印A/B

等待唤醒机制:

/**

* @program: test

* @description: 交替打印A/B 等待唤醒机制

* @author:

* @create: 2019-07-22 14:28

*/

public class Test3 {

static class MyRun implements Runnable {

static int i = 0;

@Override

public synchronized void run() {

for (int j = 0; j < 10; j++) {

if(i%2==0)

System.out.println(Thread.currentThread().getName()+":A");

else

System.out.println(Thread.currentThread().getName()+":B");

i++;

this.notifyAll();

try {

if(i>=19)

Thread.sleep(10);

else

this.wait();

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

}

public static void main(String[] args) {

MyRun myRun = new MyRun();

Thread a = new Thread(myRun);

Thread b = new Thread(myRun);

a.start();

b.start();

}

}

LockSupport 实现

/**

* @program: test

* @description:交替打印A,B LockSupport实现

* @author:

* @create: 2019-07-22 14:03

*/

public class Test2 {

static Thread a=null;

static Thread b=null;

public static void main(String[] args) {

a= new Thread(new Runnable() {

@Override

public void run() {

for (int i = 0; i < 10; i++) {

LockSupport.park();

System.out.println(Thread.currentThread().getName()+":B");

LockSupport.unpark(b);

}

}

});

b=new Thread((new Runnable() {

@Override

public void run() {

for (int i = 0; i < 10; i++) {

System.out.println(Thread.currentThread().getName()+":A");

LockSupport.unpark(a);

LockSupport.park();

}

}

}));

a.start();

b.start();

}

}

java多线程交替打印_java多线程 更优雅的实现线程同步:交替打印A、B LockSupport实现...相关推荐

  1. java 不取空值_Java:如何更优雅的处理空值?

    在笔者几年的开发经验中,经常看到项目中存在到处空值判断的情况,这些判断,会让人觉得摸不着头绪,它的出现很有可能和当前的业务逻辑并没有关系.但它会让你很头疼. 有时候,更可怕的是系统因为这些空值的情况, ...

  2. java 锁旗标_Java多线程

    Java多线程 1. 多线程存在的意义 多线程最大的作用就是能够创建"灵活响应"的桌面程序,而编写多线程最大的困难就是不同线程之间共享资源的问题,要使这些资源不会同时被多个线程访问 ...

  3. java 多线程并发 问题_JAVA多线程和并发基础面试问答

    原文链接 译文连接作者:Pankaj  译者:郑旭东  校对:方腾飞 多线程和并发问题是Java技术面试中面试官比较喜欢问的问题之一.在这里,从面试的角度列出了大部分重要的问题,但是你仍然应该牢固的掌 ...

  4. java多线程 cpu分配_java多线程总结(转载)

    Java 多线程编程总结 --------------------------------------------------------------------------------------- ...

  5. java 多线程 最优_Java多线程与并发系列从0到1全部合集,强烈建议收藏!

    在过去的时间中,我写过Java多线程与并发的整个系列. 为了方便大家的阅读,也为了让知识更系统化,这里我单独把Java多线程与并发的整个系列一并罗列于此,希望对有用的人有用,也希望能帮助到更多的人. ...

  6. java点名代码滚动_JAVA多线程实现简单的点名系统

    效果图如下: CMain函数: package com.shubing.main; public class CMain { public static void main(String[] args ...

  7. java多线程编码实现_Java多线程编码

    Java多线程编码 多线程一直是编写程序代码的一个核心,Java中实现方法有以下两种: 一.继承自Thread class Mythread extends Thread [ //方法 public ...

  8. java多线池_java多线程之线程池

    1.new Thread的弊端 执行一个异步任务你还只是如下new Thread吗? new Thread(new Runnable() { @Override public void run() { ...

  9. java多线程共享信息_java多线程信息共享

    上篇文章知识介绍了多线程的创建和启动问题,各个子线程和子线程或者说子线程和main线程没有信息的交流,这篇文章主要探讨线程之间信息共享以及交换问题.这篇文章主要以一个卖票例子来展开. 继承Thread ...

最新文章

  1. 如何在JQuery $ .each函数中编辑全局变量?
  2. 计算机英语应用研究,计算机英语辅助学习系统的研究与应用-软件工程专业论文.docx...
  3. 数学之美 系列十六(上) 不要把所有的鸡蛋放在一个篮子里 -- 谈谈最大熵模型
  4. linux fedora设置开机自动挂载win磁盘
  5. npm install -g -S -D的区别及应用场景
  6. 8个超棒的使用javascript开发的视觉特效网站
  7. 【Hbase】程序批量put数据到Hbase
  8. Docker学习总结(31)——使用Maven插件构建docker镜像
  9. 2019 outlook 数据迁移_清华开源迁移学习算法库
  10. Python数据结构与算法笔记(三):查找问题——列表查找
  11. Kubernetes vs OpenStack
  12. 刷新后保持大分类和小分类的展开状态
  13. golang ide 下载
  14. C语言:cJSON库用法详解
  15. linux用gzip文件,Linux中的Gzip命令
  16. vue项目引入typescript(vue与ts混用)
  17. Doris 与 ClickHouse 的深度对比
  18. activemq、rabbitmq、kafka原理和比较
  19. 【ABviewer从零开始教学查看器篇①】3D查看器和3D剖面板
  20. Go netpoll I/O 多路复用构建原生网络模型之源码深度解析

热门文章

  1. Numpy的广播功能
  2. Linux系统管理——系统启动和内核管理
  3. redis 数据类型详解 以及 redis适用场景场合
  4. 3.9 限制root远程登录
  5. 使用Visual Studio Code + Node.js搭建TypeScript开发环境
  6. 前端性能优化方面的知识
  7. 老鸟的Python新手教程
  8. mac使用eclipse创建java_【Java】Mac上使用Eclipse创建Java项目的一般步骤
  9. python numpy数组切片_python中numpy数组切片实验解释
  10. 二进制包如何知道go 版本_你有同时使用多版本 Go 语言的需求吗,那就快使用多版本管理利器 GVM 吧!...