public class fourThread {
int i = 10;
int j = 50;
public static void main(String[] args) {
// TODO Auto-generated method stub
fourThread ft = new fourThread();
plus addi = ft.new plus();
minus minusj = ft.new minus();
Thread t = new Thread(addi);
t.start();
Thread t1 = new Thread(addi);
t1.start();
Thread tj = new Thread(minusj);
tj.start();
Thread tj1 = new Thread(minusj);
tj1.start();
}
public synchronized void add() {
i++;
System.out.println(Thread.currentThread().getName()
+ "对i + 1 : " + i);
}
public synchronized void minus() {
j--;
System.out.println(Thread.currentThread().getName()
+ "对j - 1 : " + j);
}
class plus implements Runnable {
@Override
public void run() {
// TODO Auto-generated method stub
for (int q = 0; q < 10; q++) {
add();
}
}
}
class minus implements Runnable {
@Override
public void run() {
// TODO Auto-generated method stub
for (int p = 0; p < 10; p++) {
minus();
}
}
}
}
运行结果:
Thread-0对i + 1 : 11
Thread-3对j - 1 : 49
Thread-3对j - 1 : 48
Thread-3对j - 1 : 47
Thread-3对j - 1 : 46
Thread-3对j - 1 : 45
Thread-3对j - 1 : 44
Thread-3对j - 1 : 43
Thread-3对j - 1 : 42
Thread-3对j - 1 : 41
Thread-3对j - 1 : 40
Thread-0对i + 1 : 12
Thread-0对i + 1 : 13
Thread-0对i + 1 : 14
Thread-0对i + 1 : 15
Thread-0对i + 1 : 16
Thread-0对i + 1 : 17
Thread-0对i + 1 : 18
Thread-0对i + 1 : 19
Thread-0对i + 1 : 20
Thread-2对j - 1 : 39
Thread-2对j - 1 : 38
Thread-2对j - 1 : 37
Thread-2对j - 1 : 36
Thread-2对j - 1 : 35
Thread-2对j - 1 : 34
Thread-2对j - 1 : 33
Thread-2对j - 1 : 32
Thread-2对j - 1 : 31
Thread-2对j - 1 : 30
Thread-1对i + 1 : 21
Thread-1对i + 1 : 22
Thread-1对i + 1 : 23
Thread-1对i + 1 : 24
Thread-1对i + 1 : 25
Thread-1对i + 1 : 26
Thread-1对i + 1 : 27
Thread-1对i + 1 : 28
Thread-1对i + 1 : 29
Thread-1对i + 1 : 30
分享到:
相关推荐
实现两个线程,一个线程打印1-52,另一个线程打印A-Z,要求输出的结果如下: 1 2 A 3 4 B 5 6 C 7 8 D 9 10 11 12 ... 52 E F G H I J K ... X Y Z 即:当数字小于9时,数字和字母交替打印; 当数字大于等于9时,先把...
这个过程对所有的i从0到m-1和j从0到p-1进行迭代。 当矩阵规模增大时,单线程计算矩阵乘法可能会变得非常耗时。因此,我们利用多线程来并行计算不同的部分,以加快运算速度。一种常见的策略是将大矩阵划分为更小的...
7. **MDC(Mapped Diagnostic Context)和NDC(Nested Diagnostic Context)**:这两个特性提供了上下文信息,帮助追踪和调试多线程环境中的问题。 8. **自定义日志等级和日志事件**:开发者可以通过继承`Priority`...
冒泡排序是一种简单的排序算法,它重复地遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。遍历数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。 实验中的冒泡...
假设我们有两个矩阵A(m×n)和B(n×p),它们的乘积C(m×p)的每个元素ci,j可以通过以下公式计算得出: \[ C[i][j] = \sum_{k=1}^{n} A[i][k] \times B[k][j] \] 在单线程环境下,这个过程是从头到尾按顺序执行...
在给出的代码片段中,作者采用的是实现`Runnable`接口的方式创建了两个线程:`Inc`用于增加变量`j`的值,`Dec`用于减少变量`j`的值。下面对代码进行详细分析: ```java public class TestThreads { private int j ...
2. **创建两个线程**:分别对全局变量`i`执行加1操作和减1操作。每个线程执行相同次数(例如900万次)。 ```c DWORD __stdcall fun1(LPVOID p1) { for (int j = 0; j ; j++) { i++; } return 0; } DWORD __...
以下是一个简单的Ruby多线程程序示例,演示了如何创建和管理两个并发执行的线程: ```ruby #!/usr/bin/ruby def func1 i = 0 while i puts "func1 at: #{Time.now}" sleep(2) i += 1 end end def func2 j ...
创建一个新线程有两种方式:继承`Thread`类并重写`run()`方法,或者实现`Runnable`接口并提供`run()`方法。在聊天程序中,每个用户可能对应一个线程,用于处理用户的输入和输出。 2. **并发编程**:在多线程聊天...
该函数通常需要两个参数:线程函数指针和线程参数。线程函数指针是指向将在新线程中执行的函数,而线程参数则可以传递给这个函数,用于在新线程中传递特定的数据。 三、线程参数的用处 1. 数据传递:线程参数可以...
上述代码将会把`str1`和`str2`分别拆分为`{"3", "5"}`和`{"1", "3", "4", "5"}`两个数组。 ##### 步骤2:遍历比较 接下来,我们需要遍历第一个数组中的所有子串,并检查这些子串是否存在于第二个数组中。这可以通过...
1. **无同步机制**:设计并实现一个简单的多线程银行转账程序,其中两个线程共享资源但没有使用任何同步手段。 2. **使用Mutex互斥量**:在第一部分的基础上增加Mutex互斥量,以确保对共享资源的互斥访问。 3. **...
这里我们假设运算的对象是两个相同大小的三维数组。 ```cpp int*** add3D(int*** arr1, int*** arr2, int nx, int ny, int nz) { int*** result = allocate3D(nx, ny, nz); for (int i = 0; i ; ++i) { for (int...
在这个例子中,我们创建了一个`ThreadTest`类,其中包含两个内部类`Adder`和`Subtractor`,分别实现了`Runnable`接口。每个线程都会通过`ReentrantLock`来同步对`j`变量的访问。这里使用`lock.lock()`和`lock.unlock...
确保项目中有log4j和commons-logging两个jar文件。如果使用的是Maven项目,可以在pom.xml文件中添加如下依赖: ```xml <groupId>log4j <artifactId>log4j <version>1.2.17 <groupId>commons-logging ...
在这个例子中,`long_running_task`是一个耗时任务,接受两个参数`param1`和`param2`。我们创建了一个`ThreadPoolExecutor`,它负责管理线程池,然后使用`submit`方法提交任务到线程池,每个任务都带有不同的参数。`...
例如:1、设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。 public class ThreadTest1{ private int j; public static void main(String args[]){ ThreadTest1 tt=new ThreadTest...
这两个模块可能集成了审计和日志框架,如Log4j或java.util.logging。 10. **源代码分析**: 论文中可能会详细解释每个模块的设计决策,包括类和方法的组织,以及如何实现特定的安全功能。源代码分析可以帮助读者...
其中,v_i(t+1)是下一次迭代的速度,w是惯性权重,c1和c2是加速常数,r1和r2是两个[0,1]之间的随机数,pbest_i是粒子i的局部最优解,x_i(t)是当前粒子的位置,gbest是全局最优解。 3. 更新位置:粒子的新位置由...
在计算机编程领域,自增与自减是两个非常基础且重要的概念,它们在各种编程语言中都有所应用。通过本文,我们将深入探讨自增与自减的概念、工作原理以及在实际编程中的应用技巧,希望能够帮助读者更深刻地理解这两个...