`

4线程,2个对i加,2个对i减

 
阅读更多
package test1;


/**
 * 设计4个线程,其中2个线程,每次对i加1,另外两个线程,每次对i减一
 * 
 * @author Administrator
 *
 */
public class Thread2 {
	public static void main(String[] args) {
		ShareData d = new ShareData();
		for (int i = 0; i < 2; i++) {
			new Thread(new Runnable1(d)).start();
			new Thread(new Runnable2(d)).start();
		}
	}
}

/**
 * 加
 * @author Administrator
 *
 */
class Runnable1 implements Runnable {
	private ShareData d;
	public Runnable1 (ShareData d) {
		this.d = d;
	}
	
	@Override
	public void run() {
		d.increment();
	}
}

/**
 * 减
 * @author Administrator
 *
 */
class Runnable2 implements Runnable {
	private ShareData d;
	public Runnable2 (ShareData d) {
		this.d = d;
	}
	
	@Override
	public void run() {
		d.decrement();
	}
}


class ShareData {

	private int i = 0;
	
	public synchronized void increment () {
		i++;
		System.out.println("加后i为:" + i);
	}
	
	public synchronized void decrement () {
		i--;
		System.out.println("减后i为:" + i);
	}
}

 

 

 

分享到:
评论

相关推荐

    线程编程 四个线程...

    在 run 方法中,每个线程都会不断地执行一系列操作,包括增加或减少变量 i 的值,并输出当前线程的名称和变量 i 的值。 需要注意的是,在多线程编程中,线程之间的同步是非常重要的。如果没有正确地同步线程,可能...

    40个Java多线程问题总结

    当某个线程因等待外部资源(如网络请求或磁盘I/O操作)而阻塞时,其他线程仍然可以继续执行,确保程序不会完全停滞。这对于提高用户体验和系统响应速度至关重要。 3. **便于建模:** - 多线程技术使得复杂的任务...

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

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

    C#线程池 所有线程运行完毕

    在C#编程中,线程池(ThreadPool)是一种高效的线程管理机制,它允许开发者创建并管理多个线程,而无需直接操作线程对象。线程池中的线程可以复用,减少了创建和销毁线程的开销。当我们需要执行大量短生命周期的任务...

    多线程处理数据(工具)样例

    2. **负载均衡**:在分配任务给线程时,要尽可能使每个线程的工作负载均衡,避免某些线程过早结束而其他线程还在忙碌,这样可以最大化利用所有资源。 3. **线程池**:创建和销毁线程都有一定的开销,使用线程池可以...

    linux C 多线程编程典型实例

    `sem_t`类型代表一个信号量,`sem_init()`、`sem_wait()`和`sem_post()`用于初始化、获取(减计数)和释放(加计数)信号量。 5. **线程join**: 主线程可以通过`pthread_join()`等待子线程结束。这可以确保线程...

    QT 多线程同步QSemaphore

    `QSemaphore`的工作原理基于信号量机制,一个信号量可以看作是一个计数器,可以设定一个初始值,线程在需要资源时会尝试获取信号量,如果当前信号量大于零,则减一并继续执行,否则线程会被阻塞等待。当有线程释放...

    Qt5.12.9多线程双缓冲串口类使用

    2. **开启线程**:创建一个`QThread`实例,然后将处理串口通信的类(可能包含`QSerialPort`)的实例移动到该线程。 3. **连接信号和槽**:使用Qt的信号和槽机制,将线程中的串口事件(如数据接收、错误等)连接到...

    Java多线程--等待所有子线程执行完的五种方法.docx

    创建一个计数器为N的`CountDownLatch`,每当一个线程完成其任务时,都会调用`countDown()`,计数器减1。主线程通过调用`await()`方法阻塞,直到计数器归零(所有子线程完成)。 ```java CountDownLatch latch = new...

    “多线程”简介及其C代码实现框架

    4. **资源隔离**:每个线程都有自己的执行上下文,使得不同任务之间的影响减至最小,便于管理和调试。 在C语言中实现多线程,可以使用POSIX线程库(pthread),它提供了创建、同步、管理线程的相关函数。以下是一个...

    java多线程下载

    - `CountDownLatch`:用于同步多个线程,计数器初始化为线程数量,每个线程完成后减一,当计数器归零时,所有等待的线程可以继续执行。 - `Semaphore`:信号量,用于限制同时访问特定资源的线程数量,可以防止过多...

    java多线程断点续传[借鉴].pdf

    `CountDownLatch`计数器初始化为线程数量,每当一个线程完成下载任务,计数器减一,直到所有线程完成,计数器归零,主线程继续执行后续操作。 接下来,程序计算每个线程的下载范围。根据总文件大小(`contentLength...

    史上最全 Java 多线程面试题及答案

    - **防止阻塞**:通过多线程,即使一个线程因等待I/O或其他阻塞操作而暂停,其他线程仍可继续运行,避免了整个程序的停滞。 - **便于建模**:将大任务分解为多个小任务,每个任务由一个线程处理,简化了程序设计,...

    计算机操作系统实验操作系统中的线程同步源码文档

    2. **创建两个线程**:分别对全局变量`i`执行加1操作和减1操作。每个线程执行相同次数(例如900万次)。 ```c DWORD __stdcall fun1(LPVOID p1) { for (int j = 0; j ; j++) { i++; } return 0; } DWORD __...

    多线程编程详解

    - **多线程优势**:通过多线程,程序能够同时处理多个任务,提高响应速度和执行效率,尤其在I/O密集型或计算密集型应用中效果显著。 2. **Java中的线程** - **Thread类**:Java提供了`java.lang.Thread`类来创建...

    控制多个线程结束,后再执行统计结果

    创建CountDownLatch时需要设定计数器(count),每当一个线程完成其任务时,count会减一。当count达到0时,所有等待的线程都会被释放,可以继续执行后续操作。 4. **CyclicBarrier**:它允许一组线程互相等待,直到...

    C++实现三维动态数组,赋值加减乘算法

    在C++编程中,处理三维数据结构通常涉及到多维数组,特别是当需要模拟三...实现加、减、乘运算需要遍历数组的每个元素。这种技术广泛应用于计算机图形学、物理学模拟、图像处理等领域,对理解和操作三维数据至关重要。

    qt5多线程,信号量,互斥量,等待条件

    信号量维护了一个计数值,当线程尝试获取资源时,计数值会减一;当线程释放资源时,计数值会加一。如果计数值为负,那么尝试获取资源的线程会被阻塞,直到计数值变为非负。在生产者-消费者模型中,信号量可以用来...

    java多线程学习-java.util.concurrent详解(一) Latch/Barrier

    这个例子展示了4个线程(参与者)各自执行`doSomething()`,然后在`CyclicBarrier`上等待,直到所有线程都到达,才会执行回调函数,表示所有准备工作完成,比赛开始。 总结来说,`java.util.concurrent`包中的`...

    Java多线程编程实现

    在Java中,多线程是一种强大的工具,它允许程序同时执行多个任务。本文将详细解析一个示例程序,该程序通过`CountDownLatch`来协调主线程与多个子线程之间的执行流程。 #### 主线程(MainThread) ```java public ...

Global site tag (gtag.js) - Google Analytics