`

两个线程,分别打印[1,3,5]和[2,4,6],写一个程序,打印[1,2,3,4,5,6]。

 
阅读更多
两个线程,分别打印[1,3,5]和[2,4,6],写一个程序,打印[1,2,3,4,5,6]。
方案1 用synchronized 配合wait notify
方案2 用ReentrantLock配合condition
方案3 对线程数据取余,直接调用线程的run方法

方案1不能实现超过2个线程的要求,因为notify是不能保证唤醒哪个线程
下面分别是3种实现的代码


package com.eyu.ahxy.module.common.config;

import java.util.concurrent.TimeUnit;
import static com.eyu.ahxy.module.common.config.OneTwoOneTwoTest1.*;

public class OneTwoOneTwoTest1 {
	static int NUM = 0;
	static int MAX = 6;
	static Object LOCK = new Object();

	public static void main(String[] args) throws InterruptedException {

		Thread thread1 = new ThreadTest1();
		thread1.start();
		Thread thread2 = new ThreadTest1();
		thread2.start();
		TimeUnit.SECONDS.sleep(1);
		synchronized (LOCK) {
			LOCK.notify();
		}
		thread1.join();
		thread2.join();
	}

}

class ThreadTest1 extends Thread {

	public void run() {
		while (true) {
			synchronized (LOCK) {
				try {
					LOCK.wait();
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				NUM = NUM + 1;
				System.err.println(NUM + "        ====" + Thread.currentThread());
				if (NUM >= MAX) {
					break;
				}
				LOCK.notify();
			}

		}

	};

}



package com.eyu.ahxy.module.common.config;

import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;
import static com.eyu.ahxy.module.common.config.OneTwoOneTwoTest2.*;

public class OneTwoOneTwoTest2 {
	static int NUM = 0;
	static int MAX = 6;

	static ReentrantLock LOCK = new ReentrantLock();
	static Condition thread1Ready = LOCK.newCondition();
	static Condition thread2Ready = LOCK.newCondition();

	public static void main(String[] args) throws InterruptedException {

		Thread thread1 = new ThreadTest2(thread1Ready, thread2Ready);
		thread1.start();
		Thread thread2 = new ThreadTest2(thread2Ready, thread1Ready);
		thread2.start();
		TimeUnit.SECONDS.sleep(1);

		LOCK.lock();
		thread1Ready.signal();
		LOCK.unlock();

		thread1.join();
		thread2.join();

	}

}

class ThreadTest2 extends Thread {
	Condition self;
	Condition next;

	ThreadTest2(Condition self, Condition next) {
		this.self = self;
		this.next = next;
	}

	public void run() {
		while (true) {
			try {
				LOCK.lock();
				self.await();
				NUM = NUM + 1;
				System.err.println(NUM + "        ====" + Thread.currentThread());
				if (NUM >= MAX) {
					break;
				}
				next.signal();
			} catch (InterruptedException e) {
				e.printStackTrace();
			} finally {
				LOCK.unlock();
			}
		}
	};

}



package com.eyu.ahxy.module.common.config;

import static com.eyu.ahxy.module.common.config.OneTwoOneTwoTest3.NUM;

import java.util.ArrayList;
import java.util.List;

public class OneTwoOneTwoTest3 {
	static int NUM = 0;
	static int MAX = 6;
	static int THREAD_NUM = 2;

	public static void main(String[] args) throws InterruptedException {
		List<Thread> list = new ArrayList<>();
		for (int i = 0; i < THREAD_NUM; i++) {
			list.add(new ThreadTest3());
		}

		for (int i = 0; i < MAX; i++) {
			int num = i % THREAD_NUM;
			list.get(num).run();;
		}

	}

}

class ThreadTest3 extends Thread {

	public void run() {
		NUM = NUM + 1;
		System.err.println(NUM + "        ====" + Thread.currentThread());
	};

}



0
0
分享到:
评论

相关推荐

    java用线程两种方式

    * 分别使用Runnable接口和Thread类编程实 编写一应用程序创建两个线程一个线程打印输出1—1000之间所有的奇数(Odd Number) * 另外一个线程打印输出1-1000之间所有的偶数(Even Number)要求两个线程随机休眠一 段...

    java实验4.doc

    1、编写程序,创建5个线程,分别输出5个线程的名字,用继承Thread类和实现Runnable接口的方法来实现。 2、以车站售票为例研究资源共享的问题。假设两个窗口同时出售一次列车的车票,车票就是共享资源,两个窗口就是...

    多线程 打印1-99,100-199

    1. 实现一个类ThreadMock(模拟线程),用来模仿Thread类,该类具有以下特征: a) Public class ThreadMock implents ...例如第一个线程打印1,接着第二个线程打印100,接着第一个线程打印2。。。。。。。。依此类推。

    linux中一个程序的两个线程的同步(c语言实现)

    两个线程共享变量a,一个负责加一,一个负责输出 通过信号灯的pv操作完成

    使用继承Thread类的方式定义两个线程,.txt

    请使用继承Thread类的方式定义两个线程,一个线程可以计算1--100所有数字的累加和,另一个线程可以计算1--1000所有数字的累加和,每个线程计算完毕后各自打印计算结果,格式例如:”xxx线程计算1--100的累加和,结果...

    两个线程交替执行

    一个线程打印123,另一个打印456,最终结果是打印123 456 123 45

    用C#实现的多线程同步打印文章(windows操作系统实验)

    本实验通过设计两个线程,一个是文章下载线程和一个文章打印线程,用来实现模拟线程同步打印机,文章下载线程实现把文章下载到缓冲区,文章打印线程实现把文章打印出来。

    java多线程、通信机制、Thread类以及Runnable接口间的使用实例

    1. 写两个线程,一个线程打印1-52,另一个线程打印字母A-Z。打印顺序为12A34B56C……5152Z。 学习线程之间的通信协调关系。 2. 使用 runnable 接口实现按两个不同的时间间隔( 1 秒和 3 秒)在屏幕上显示当前时间。...

    java多线程使用

    编写两个线程:  第一个线程计算2-1000000之间的质数及个数  第二个线程计算1000000-2000000之间的质数 及个数

    线程的编写

    一个小的关于进程的编写,可能不是很完善,还需在升入理解

    linux 文件字数统计的多线程程序

    报告包括源程序、主要功能模块、程序流程图、心得、程序调试等等,编写一个程序构建两个子线程,分别对两个文件的字数进行统计,两个线程统计完后写入到子线程与父线程共享的一段内存(或变量)中,然后父线程从这一...

    线程练习题

    利用线程的通信机制,用两个线程打印以下的结果: 1 2 A 3 4 B 5 6 C 7 8 D ... 49 50 Y 51 52 Z 即:数字和字母交替打印;

    多线程

    2) 第二个线程打印b字母100次 3) 第三个线程打印1~100的整数 采用继承Thread类的方式实现; 2. 利用Runnable接口实现与第1题相同的功能; 3. 测试一个Applet小应用程序,体会多线程程序的运行过程; 三、实验步骤 ...

    5操作系统实验报告.doc

    5、写一个单线程程序,同样完成10万个随机数求和的计算,统计计算时间,并 和前面的结果对比; 6、让单线程程序睡眠四秒钟、多线程程序各子线程睡一秒的条件下(两程序的 总睡眠时间相同),对比执行结果; 7、分析...

    两个线程,一个做面包,一个卖面包,适合新人学习或当作业

    要求利用线程同步编写一个多线程程序,模拟面包店面包师加工面包和销售面包的过程,当面包师加工一块面包时,打印输出“面包师加工出一块面包,现有面包有**块”;当店员1或店员2卖出一块面包时,打印输出“店员1或...

    Java程序设计案例教程-第8章-多线程编程.pptx

    进程和线程的区别 进程和线程的区别可以总结为如下几点: 一个程序至少有一个进程,一个进程至少有一个线程,线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。...

    用多线程同步方法解决生产者-消费者问题

    有界缓冲区内设有20个存储单元,放入/取出的数据项设定为1~20这20个整型数。 (1) 每个生产者和消费者对有界...(2) 生产者和消费者各有两个以上。 (3) 多个生产者或多个消费者之间须共享对缓冲区进行操作的函数代码。

    threecodes.rar_C语言_pipes_threecodes_父进程 创建 子进程_生产者消费者

    1、 用C语言写一个程序名字为procs4,该程序运行过程中共有4个进程,procs4程序(父进程)创建2个子进程p1和p2,p1子进程再创建一个子进程p3。4个进程完成如下工作: 父进程并打印字符串“I am main process”;p1子...

    面试编程题

    6、设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。 7、列出某个目录下的所有文件。 8、编写一个Hibernate程序,用来获得所有的学生信息。 9、使用Struts2框架来实现页面国际化。 10、写一个...

    嵌入式系统的开发设计

    (1)源代码编写:编写源 C/C++及汇编程序; (2)程序编译:通过专用编译器编译程序; (3)软件仿真调试:在 SDK中仿真软件运行情况; (4)程序下载:通过 JTAG、USB、UART 方式下载到目标板上; 5)软...

Global site tag (gtag.js) - Google Analytics