package t3.copy;

 public class ThreadA extends Thread {

     private Object lock;

     public ThreadA(Object lock) {
super();
this.lock = lock;
} @Override
public void run() {
try {
while(true) {
synchronized (lock) {
if(Run.flag) {
System.out.println(Thread.currentThread().getName() + " ~~~~ ");
Run.flag = !Run.flag;
lock.wait();
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
} }
 package t3.copy;

 public class ThreadB extends Thread {

     private Object lock;

     public ThreadB(Object lock) {
super();
this.lock = lock;
} @Override
public void run() {
try {
while(true) {
synchronized (lock) {
if(!Run.flag) {
System.out.println(Thread.currentThread().getName() + " !!!! ");
Run.flag = !Run.flag;
lock.notify();
}
} }
} catch (Exception e) {
e.printStackTrace();
}
} }
 package t3.copy;

 public class Run {

     public static boolean flag = true;

     public static void main(String[] args) {
try {
Object lock = new Object();
ThreadA a = new ThreadA(lock);
a.start();
Thread.sleep(50);
ThreadB b = new ThreadB(lock);
b.start();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

不知道可不可以不借助于中间变量判断。

不借助于中间变量判断,但是交替打印次数一致。

 package conditionTest.copy;

 import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock; public class MyService { private ReentrantLock lock = new ReentrantLock();
private Condition conditionSet = lock.newCondition();
private Condition conditionGet = lock.newCondition(); public void set() {
try {
lock.lock();
// while(hasValue) {
// }
System.out.println("打印★★★★★★");
conditionGet.signal();
conditionSet.await();
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
} finally {
lock.unlock();
}
} public void get() {
try {
lock.lock();
System.out.println("打印☆☆☆☆☆☆");
conditionSet.signal();
conditionGet.await();
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
} finally {
lock.unlock();
}
} }
 package conditionTest.copy;

 public class MyThreadA extends Thread {

     private MyService service;

     public MyThreadA(MyService service) {
super();
this.service = service;
} @Override
public void run() {
for(int i=0; i<100; i++) {
service.set();
}
} }
 package conditionTest.copy;

 public class MyThreadB extends Thread {

     private MyService service;

     public MyThreadB(MyService service) {
super();
this.service = service;
} @Override
public void run() {
for(int i=0; i<100; i++) {
service.get();
}
} }
 package conditionTest.copy;

 public class Run {

     public static void main(String[] args) {
MyService service = new MyService();
MyThreadA a = new MyThreadA(service);
a.start();
MyThreadB b = new MyThreadB(service);
b.start();
} }

Thread--两线程交替打印的更多相关文章

  1. 使用Java线程并发库实现两个线程交替打印的线程题

    背景:是这样的今天在地铁上浏览了以下网页,看到网上一朋友问了一个多线程的问题.晚上闲着没事就决定把它实现出来. 题目: 1.开启两个线程,一个线程打印A-Z,两一个线程打印1-52的数据. 2.实现交 ...

  2. 多线程下,两个线程交替打印0 -100,使用wait()和notify()

    多线程下,两个线程交替打印0 -100,使用wait()和notify() public class ThreadTest{ private static final Object lock = ne ...

  3. 使用Java实现三个线程交替打印0-74

    使用Java实现三个线程交替打印0-74 题目分析 三个线程交替打印,即3个线程是按顺序执行的.一个线程执行完之后,唤醒下一个线程,然后阻塞,等待被该线程的上一个线程唤醒.执行的顺序是一个环装的队列 ...

  4. java实现线程交替打印1-52和A-Z

    题目: 1.开启两个线程,一个线程打印A-Z,两一个线程打印1-52的数据. 2.实现交替打印,输出结果为12A34B...........5152Z. 3.请用多线程方式实现. 实现思路:通过锁(s ...

  5. [Java并发]实现两个线程交替打印奇偶数(volatile+yield实现)

    解题思路 实现一个类OddEven 有一个打印奇数的方法,有一个打印偶数的方法. 类中有一个volatile变量 ,用来控制当前状态是该哪个方法打印. 方法中打印每个数前首先判断volatile变量的 ...

  6. 两个线程交替打印奇偶数【Lock版】

    import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public clas ...

  7. A、B两个线程交替打印1 -- 100

    方案一:import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.u ...

  8. 斐讯面试记录—三线程交替打印ABC

    package cn.shenzhen.feixun; public class PrintABC extends Thread{ private String name; private Objec ...

  9. Python实现线程交替打印字符串

    import threading con = threading.Condition() word = u"12345上山打老虎" def work(): global word ...

随机推荐

  1. windows下修改pip安装源的办法

    之前的随笔里有写过关于Mac OS和Linux的,现在需要用到Windows的系统, 修改方法:路径----> C:\Users\用户名\AppData\Roaming,在Roaming文件夹下 ...

  2. Docker入门以及漏洞环境搭建(10.23 第二十五天)

    Docker:开源的应用程序容器引擎,使用Go语言.借助于docker打包的应用程序,将这些应用程序 包含在容器里面,在容器中实现虚拟化,容器使用的是沙箱机制,相互独立,占用资源非常少. Docker ...

  3. 2.11 学习总结 之 ajax

    一.说在前面 昨天 学习了 json 数据结构 今天 学习ajax 并使用 json  二.jquery的ajax操作 1.查询jquery的官方文档发现与ajax相关的jquey方法如下: 1)$. ...

  4. PYTHON画三维图

    import matplotlib.pyplot as pltfrom mpl_toolkits.mplot3d import Axes3Dimport numpy as np #bbb=[1 if ...

  5. C++编程学习(九)this指针&友元函数

    mooc西工大魏英老师的课程通道关闭了,难受.现在边看工程代码边重温刷第一遍C++时候的知识点,顺序没有按照大纲的来,想到哪写到哪. this是干啥用的? 简介:在 C++ 中,每一个对象都能通过 t ...

  6. Windows平台整合SpringBoot+KAFKA__第2部分_代码编写前传

    开始准备写测试代码 看半天不太懂(我也算是小白级别的,看我搞windows版本的kafka就知道了), 看文档无聊,偶然看到一个KAFKA的windows管理程序,于是就试试就装了一个,感觉那个玩意也 ...

  7. 设置虚拟机静态ip

    1.查看本机ip.网关.dns服务器 IPv4地址:本机局域网ip 路由器:网关地址 nameserver:局域网内部dns服务器 其他dns服务器 移动.电信和联通:114.114.114.114 ...

  8. 【Vue中的坑】路由相同参数不同无法触发路由

    场景: vue实现导航栏,二级导航栏跳转到相同页面,通过参数来实现到该页面后,根据参数来滚动到对应到位置 网上的解决方法: 通常情况下我们喜欢设置keepAlive 包裹 router-view &l ...

  9. EUI库 - 容器

      eui.UILayer UILayer是Group的子类它只有一个功能,到放到场景上后,宽高永远和场景宽度一致   Group Group 是自动布局的容器基类.如果包含的子项内容太大需要滚动显示 ...

  10. 【LeetCode】最长回文子串-中心扩展法

    [问题]给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 : 输入: "babad" 输出: "bab" 注意: ...