`
annan211
  • 浏览: 459984 次
  • 性别: 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操作,每次操作前先获取锁,操作后释放锁...

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

    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中的...

    线程三个随机数

    生成随机数的方法通常是`Next()`,它可以接受一个或两个参数来定义随机数的范围。 考虑到描述中提到的“为了能将生成的随机数显示出来”,这意味着我们需要一种方式将线程内部生成的随机数传递到主线程或其他地方...

Global site tag (gtag.js) - Google Analytics