`
annan211
  • 浏览: 460979 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

4个线程,2个每次加1,两个每次减1

 
阅读更多
package threadTest;

public class MultiThreadShareDemo {

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

		Data data = new Data();

		Plus p = new Plus(data);
		Cut c = new Cut(data);

		Thread t1 = new Thread(p);
		Thread t2 = new Thread(p);

		Thread t3 = new Thread(c);
		Thread t4 = new Thread(c);

		t1.start();
		t2.start();
		t3.start();
		t4.start();

	}
}

/**
 * 数据包装
 * @author jingfn
 *
 */
 class Data{
	 private int data;
	 private boolean flag;
	 private int count = 2;

	public synchronized Data plus(Data dataIns){
		while(flag){
			try {
				this.wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		dataIns.data = dataIns.data - 1;
		dataIns.count = dataIns.count - 1;
		System.out.println(Thread.currentThread().getName()+"--plus--------"+dataIns.data+"---"+dataIns.count);
		if(dataIns.count <= 0){
			dataIns.flag = true;
			this.notifyAll();
		}
		return dataIns;
	}

	public synchronized Data cut(Data dataIns){
		while(!flag){
			try {
				this.wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		dataIns.data = dataIns.data + 1;
		dataIns.count = dataIns.count + 1;
		System.out.println(Thread.currentThread().getName()+"--cut--"+dataIns.data+"---"+dataIns.count);
		if(dataIns.count >= 2){
			dataIns.flag = false;
			this.notifyAll();
		}
		return dataIns;
	}

 }

 /**
  * 加线程
  * @author jingfn
  *
  */
 class Plus implements  Runnable {
	 private Data instance;
	 public Plus(Data instance){
		 this.instance = instance;
	 }
	 public void run(){
		 while(true){
			 instance.plus(instance);
		 }
	 }
 }

 /**
  * 减线程
  * @author jingfn
  *
  */
 class Cut implements  Runnable {
	 private Data instance;
	 public Cut(Data instance){
		 this.instance = instance;
	 }
	 public void run(){
		 while(true){
			 instance.cut(instance);
		 }
	 }
 }

分享到:
评论

相关推荐

    java用线程的两种实现方式设计四个线程两次对J加1两次对J减1

    在上面的代码中,我们创建了四个线程,两个是 T1 类型,两个是 T2 类型。我们使用 Thread 构造函数来创建线程,并将相应的 Runnable 对象或 Thread 对象传递给它。然后,我们使用 start 方法来启动线程。 线程的...

    设计4个线程,其中两个对j增加,两个对j减少

    本示例中,我们创建了4个线程,其中两个线程负责递增变量`j`,另外两个线程负责递减`j`。这个设计主要展示了线程同步和竞争条件的概念。 首先,我们需要理解`Thread`类在Java中的作用。`Thread`是Java的内置类,...

    java的thread类重写run方法的双线程从1加到100

    在这个练习中,我们将两个线程分别从1加到50,然后从51加到100: ```java @Override public void run() { for (int i = start; i ; i++) { System.out.println("当前线程:" + Thread.currentThread().getName() ...

    Java实现的两个线程同时运行案例

    Java多线程编程实现两个线程同时运行案例 Java多线程编程是Java编程中的一种重要技术,用于实现多任务并发执行,提高程序的执行效率和响应速度。在本文中,我们将介绍如何使用Java实现两个线程同时运行的案例,涉及...

    java 两个线程相互顺序输出

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

    多线程实现多控制两个案例

    本篇文章将详细讲解如何通过多线程实现对两个任务的独立控制,以及如何进行线程同步,以确保数据的一致性。 首先,我们来看第一个案例:实现两个线程分别控制两个运动。在计算机编程中,线程可以被视为程序的执行流...

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

    在`printodd()`函数中,线程会打印从1开始的奇数,每次加2。线程首先获得`data_mutex`的锁,然后进入`data_var.wait(ulock,[]{return label;})`,这里的`wait()`函数会在满足给定的条件(即`label`为`false`)时阻塞...

    操作系统——实验四 windows中线程的创建和同步控制

    这两个线程共享一个数组A,写线程对数组分别进行10次写操作,每次写操作对A的每个元素赋一个相同的值;读线程对数组分别进行10次读操作,每次读操作输出A中所有元素的值。写出相应代码,并分析运行结果。修改代码,使...

    Qt 多线程访问同一个变量

    描述中提到了使用互斥锁来解决这个问题,并通过创建两个线程ThreadA和ThreadB来演示这一过程。 首先,理解多线程并发访问同一变量的问题。在多线程环境中,如果多个线程同时读写同一变量,可能会引发数据不一致性和...

    多线程设计一个火车售票模拟程序

    在每次循环中,我们都会检查是否还有剩余的火车票,如果有,则将其售出,并将 count 变量加1。 线程同步的实现 在 run 方法中,我们使用了 synchronized 关键字来锁定 SaleTickets 对象,使得只有一个线程可以执行...

    1.操作系统实验1_4线程优先级抢占1

    这两个线程的代码分别在thread1_entry和thread2_entry函数中定义。在应用程序的application.c文件中,使用rt_thread_init函数初始化线程,指定线程名、入口函数、参数、栈空间、栈大小以及优先级。线程t1的优先级为5...

    简单实现多线程同步示例(模拟购票系统)

    死锁发生在两个或多个线程互相等待对方释放资源的情况下,导致所有线程都无法继续执行。虽然此示例未涉及线程守护,但在实际应用中,我们可能还需要关注线程的生命周期管理,比如设置守护线程(daemon thread),使...

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

    这里的`currentPrintedName`变量用于记录当前应打印的线程名称,每次打印完成后更新这个值,并唤醒所有等待的线程。这样,线程会按照预期的顺序执行。 需要注意的是,`wait()`和`notifyAll()`必须在`synchronized`...

    Qt创建线程的两种方式+线程池方式

    1.方式1:继承 QThread 类方式:通过继承 QThread 类并重写 run() 函数来创建线程,线程对象本身即为线程。 优点:相对简单,易于理解和实现;可以直接重写 run() 函数来定义线程的逻辑;可以通过信号和槽机制与其他...

    Python语言基础:线程同步.pptx

    在提供的代码示例中,我们创建了两个线程`t1`和`t2`,它们分别执行`job1()`和`job2()`函数。这两个函数都操作全局变量A,因此需要同步。 - `job1()`函数:对A进行10次加1操作,每次操作前先获取锁,操作后释放锁...

    使用Java多线程的同步机制编写应用程序.docx

    同步强调的是多个线程之间的有序性,即在某个线程完成特定操作之前,其他线程必须等待。这有助于防止数据竞争和不一致的状态。异步则允许线程无序执行,通常伴随着回调或事件驱动模型,它提高了系统的响应速度,但...

    线程同步解决火车站售票问题

    4. **死锁**:在实现线程同步时,还需要注意避免死锁的发生,即两个或更多的线程相互等待对方释放资源,导致程序无法继续执行。在设计售票逻辑时,应确保没有循环等待的情况。 5. **公平与非公平策略**:线程同步...

    实验八:Java多线程

    1. **线程创建**:通过继承`Thread`类创建两个子线程类`ThreadCity1`和`ThreadCity2`。 2. **线程启动**:在`MainThread`类的`main`方法中创建这两个线程的实例,并调用`start()`方法启动线程。 3. **线程行为**:每...

    MFC c++ vs2005 多线程 demo

    1. 创建两个派生自CWinThread的类,例如CThreadBall1和CThreadBall2,分别对应两个小球。 2. 在每个类的Run()函数中实现小球的运动逻辑,包括更新位置、重新绘制窗口等。 3. 使用AfxBeginThread()函数启动线程。这个...

    c++ builder 多线程

    在C++ Builder中实现多线程,主要是利用了其内置的VCL(Visual Component Library)框架和RTL(Run-Time Library)库,这两个组件库提供了对Windows API的封装,支持创建并发执行的线程。 ### 一、C++ Builder中的...

Global site tag (gtag.js) - Google Analytics