两个线程每隔一秒钟交替打印5个数

package test.thread;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

public class ExecutorTest {

private static int i=0;

private static final int PRINT_COUNT=5;

private static final int CYCLE_COUNT=50;

private static Object synchronizer=new Object();

public static void main(String[] args) {

ExecutorService service=Executors.newFixedThreadPool(2);

service.execute(new Runnable(){

public void run(){

int j=0;

synchronized(synchronizer){

while(i++<CYCLE_COUNT){

if(j++<PRINT_COUNT){

System.out.println("1:"+i);

if(j==PRINT_COUNT){

System.out.println();

}

}else{

i--;

j=0;

synchronizer.notify();

try {

Thread.sleep(1000);

synchronizer.wait();

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

if(i>=50){

synchronizer.notify();  //唤醒最后处于等待状态的线程

}

}

}

});

service.execute(new Runnable(){

public void run(){

synchronized(synchronizer){

int j=0;

while(i++<CYCLE_COUNT){

if(j++<PRINT_COUNT){

System.out.println("2:"+i);

if(j==PRINT_COUNT){

System.out.println();

}

}else{

i--;

j=0;

synchronizer.notify();

try {

Thread.sleep(1000);

synchronizer.wait();

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

if(i>=50){

synchronizer.notify(); //唤醒最后处于等待状态的线程

}

}

}

});

service.shutdown();

}

}

输出结构:

1:1

1:2

1:3

1:4

1:5

2:6

2:7

2:8

2:9

2:10

1:11

1:12

1:13

1:14

1:15

2:16

2:17

2:18

2:19

2:20

1:21

1:22

1:23

1:24

1:25

2:26

2:27

2:28

2:29

2:30

1:31

1:32

1:33

1:34

1:35

2:36

2:37

2:38

2:39

2:40

1:41

1:42

1:43

1:44

1:45

2:46

2:47

2:48

2:49

2:50

时间: 2024-10-10 02:49:35

两个线程每隔一秒钟交替打印5个数的相关文章

Java 测试:创建两个线程,模拟对话,交替输出

|--需求说明 |--实现方式 嗯  这个可以视作一个经典的消费者和生产者的问题,详细见代码注释 |--代码内容 1 /** 2 * @auther::9527 3 * @Description: 消费者 4 * @program: 多线程 5 * @create: 2019-08-10 10:45 6 */ 7 public class Consumer extends Thread{ 8 private MiddleMan mid = null; 9 10 11 public Consume

两个线程交替打印信息

看见一个关于两个线程交替打印信息的题目,题目大概是 子线程循环 10 次,接着主线程循环 100 次,接着又回到子线程循环 10 次,接着再回到主线程又循环 100 次,如此循环50次,试写出代码. 写了两个版本,一个是用了mutex,不用条件变量:另外一个是用条件变量. 第一个,不用条件变量 1 #include <stdio.h> 2 #include <string.h> 3 #include <pthread.h> 4 5 6 7 const int LOOP_

经典面试题——两个线程交替打印奇数和偶数

前提 今天下班时候和同事聊天偶然听到面试题“两个线程交替打印奇数和偶数”的实现,这里做一个复盘. 复盘 场景一:线程A打印奇数,线程B打印偶数,线程A和线程B交替打印,使用对象监视器实现. 场景二:线程A打印奇数,线程B打印偶数,线程A和线程B交替打印,使用JDK提供的并发类库实现. 这两个场景中,场景一是一种比较古老的同步方式,本质由JVM实现:场景二是JDK1.5引入JUC包之后简化了并发编程的前提下的更简便的实现.下面针对两个场景做对应的实现. 场景一 场景一中,线程A和线程B交替打印奇数

实现两个线程从0-100交替打印

分享一道多线程面试题,只是拿来练手的,这里通过两种方式去实现0-100交替打印,大家无聊的话,可以瞅两眼. 一.Synchronized实现: public class PrintNumberIncrInSynchronized { private static int number; private static final Object object = new Object(); public static void main(String[] args) { new Thread(()

两个线程交替打印1-99

参考https://github.com/crossoverJie/JCSprout/blob/master/src/main/java/com/crossoverjie/actual/TwoThread.java从线程方面实现交替打印. public class Test { volatile boolean isEven = false; @org.junit.Test public void testfda() throws InterruptedException { Thread a

经典笔试题:两个线程交替打印奇偶数

一.采用对象的wait() notify()方法实现 package com.gaopeng.programming; import java.util.concurrent.TimeUnit; /** * 经典笔试题:交替打印奇偶数 采用对象的wait() notify()方法实现 * * @author gaopeng * */ public class OddEvenThread { private static volatile Integer counter = 0; public s

头条面试题之实现两个线程轮流打印字符串

在面试头条的时候,有一个很有意思的题目,利用两个线程交替打印一个字符串,这里主要就是对多线程中wait/notify的应用,特此记录. 对于wait()和notify()的理解,还是要从jdk官方文档中开始,在Object类方法中有: void notify() Wakes up a single thread that is waiting on this object’s monitor. 译:唤醒在此对象监视器上等待的单个线程 void notifyAll() Wakes up all t

java多线程 更优雅的实现线程同步:交替打印A、B LockSupport实现

一 问题概述 线程或者进程之间有两种关系 同步和互斥,我们通常实现同步方法是使用线程的等待唤醒机制,而等待唤醒机制的使用是建立在互斥的继承上的.但是同步线程并不一定是必须要实现互斥的.比如一个线程打印A,一个线程打印B.这两个线程就没有互斥关系,但是提出这么个需求:交替打印A.B .我们一般的解决方案,往往要使用wait()/notify机制. 二 LockSupport 介绍 LockSupport作为一个工具类,主要学习它的方法. park():在线程内调用,表示当前线程自我阻塞,直到获得许

创建两个线程模拟火车站两个窗口售票程序

题目:创建两个线程模拟火车站两个窗口售票程序,窗口售票时间为1秒,两个窗口不能同时售票 #include<Windows.h> #include<iostream> using namespace std; //这是2个线程模拟买火车票的小程序 DWORD WINAPI Fun1Proc(LPVOID lpParameter);//thread data DWORD WINAPI Fun2Proc(LPVOID lpParameter);//thread data int inde