`

两个线程,分别打印[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
分享到:
评论

相关推荐

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

    根据实验需求,我们需要创建两个子线程,分别打印从 1 到 99 和从 100 到 199 的数字,并且这两个线程需要交替打印数字。 **3.1 创建打印线程** 首先,我们创建两个类 `Test1` 和 `Test2` 来代表两个子线程,它们...

    java用线程两种方式

    在这个main方法中,程序通过两种方式创建了两个线程:一个打印1到1000之间的所有奇数,另一个打印所有偶数。通过使用while循环,程序会持续运行直到两个线程都完成了它们的任务。 总结来说,Java通过两种方式提供了...

    java实验4.doc

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

    两个线程交替执行

    线程 a 负责打印数字 1、2、3,而线程 b 负责打印数字 4、5、6。通过使用 synchronized 关键字,我们可以确保在某个时刻只有一个线程可以访问共享资源 LOCK。 在代码中,我们还可以看到使用了 wait() 和 notify() ...

    实现一个数据单元,包括学号和姓名两部分。编写两个线程,一个线程往数据单元中写,另一个线程往出读。要求每写一次就往出读一次。

    本实验的任务是设计并实现一个数据单元,该单元包含学号和姓名两个字段,并且使用两个线程,一个用于写入数据,另一个用于读取数据。这种设计模式被称为“生产者-消费者”问题,是多线程编程中的经典案例。 首先,...

    c#多线程顺序打印1-100数字-源码.rar

    例如,如果创建了两个线程,一个打印1-50,另一个打印51-100。 2. **初始化AutoResetEvent**:每个线程在启动前都会获得一个`AutoResetEvent`实例,初始状态为未设置(即等待状态)。 3. **线程执行**:每个线程...

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

    在本实验中,我们创建了两个线程:下载线程和打印线程,分别处理文章的下载和打印操作。 文章下载线程的任务是从网络或者其他来源获取文章,并将其存储到内存中的缓冲区。这个过程可能涉及到网络I/O操作,通常比较...

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

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

    3个线程,根据不同规则打印线程名称

    标题提到的"3个线程,根据不同规则打印线程名称"是一个典型的多线程同步问题,通常涉及到线程的创建、线程间通信以及同步机制。 首先,我们要了解如何在Java中创建线程。有两类方式:一是继承`Thread`类,重写`run...

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

    程序的核心功能是创建两个子线程,每个线程负责一个文件的字数统计,统计完成后,线程将结果写入共享内存区域,由父线程读取并打印出来。同时,程序需要解决线程同步和互斥问题,以确保数据的一致性和正确性。 **二...

    多线程依次循环打印26个英文字母

    我们可以创建一个全局的条件队列和一个锁,每个线程在打印字母前先获取锁,然后检查当前是否轮到自己打印。如果不是,则释放锁并等待;如果是,则打印字母并唤醒下一个等待的线程。这样,即使在多线程环境下,字母也...

    C++11用两个线程轮流打印整数的实现方法

    本文将详细解析如何使用C++11的标准线程语法来实现两个线程轮流打印整数,其中一个线程打印奇数,另一个线程打印偶数,同时涉及到线程同步的关键技术——互斥量和条件变量。 首先,为了确保线程安全,我们需要使用...

    java 两个线程相互顺序输出

    标题“java 两个线程相互顺序输出”涉及的问题是如何在多线程环境下控制线程的执行顺序,使得两个线程可以按照特定的顺序交替打印输出。这通常涉及到线程同步和通信的概念。下面将详细解释这些知识点。 1. **线程...

    假脱机打印程序与虚拟设备

    【守护程序】在假脱机打印系统中,打印请求接收程序和打印程序是两个关键的守护进程。守护进程是在系统启动后持续运行的程序,负责监听和处理打印请求。打印请求接收程序接收客户端发送的打印请求,并将这些请求存入...

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

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

    java多线程使用

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

    MFC打印消息控件【支持多线程】

    本文将详细讲解如何利用MFC实现一个支持多线程打印调试日志的控件,并探讨其中涉及的关键技术,如内存池、锁机制以及多线程编程。 1. **MFC打印日志** MFC中的COutputWnd或CDocument等类通常用于处理输出,但它们...

    线程的编写

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

    Linux编程技术-实验4 多线程编程.doc

    * 创建两个线程 * 如果线程正常结束,得到线程的结束状态值,并打印 线程一完成以下操作: * 设置全局变量 key 的值为字符串“hello world” * 打印 3 次字符串“当前线程 ID:key 值” * 接收到线程二发送的取消...

Global site tag (gtag.js) - Google Analytics