欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

多线程-用JAVA写一个多线程程序,写四个线程,其中二个对一个变量加1,另外二个对一个变量减1...

程序员文章站 2024-01-09 23:47:34
...


public class IncDecThread {

private int j=10;

/*
* 题目:用JAVA写一个多线程程序,写四个线程,其中二个对一个变量加1,另外二个对一个变量减1
* 两个问题:
* 1、线程同步--synchronized
* 2、线程之间如何共享同一个j变量--内部类
*/
public static void main(String[] args) {
IncDecThread incDec=new IncDecThread();
Inc inc=incDec.new Inc();
Dec dec=incDec.new Dec();
for(int i=0;i<2;i++){
Thread thread=new Thread(inc);
thread.start();
thread=new Thread(dec);
thread.start();
}
}

public synchronized void inc(){
j++;
System.out.println(Thread.currentThread().getName()+"-inc:"+j);
}
public synchronized void dec(){
j--;
System.out.println(Thread.currentThread().getName()+"-dec:"+j);
}

class Inc implements Runnable{
public void run(){
for(int i=0;i<20;i++){
inc();
}
}
}
class Dec implements Runnable{
public void run(){
for(int i=0;i<20;i++){
dec();
}
}
}
}





第二种解法 :



package com.ljn.base;

/**
* @author lijinnan
* @date:2013-9-12 上午9:55:32
*/

public class IncDecThread2 {

/**
* 测试次数
*/
public static final int TEST_COUNT = 20;

/*
* 题目:用JAVA写一个多线程程序,写四个线程,其中二个对一个变量加1,另外二个对一个变量减1
* 两个问题:
* 1、线程同步--synchronized
* 2、线程之间如何共享同一个j变量--将j以及对j的操作封装在Data类中,然后作为共享对象传递给IncRunnable和DecRunnable
*
* 相对上面第一种解法(利用内部类),本解法更符合面向对象的思想
*/
public static void main(String[] args) {
Data data = new Data();

//加1线程,2个
new Thread(new IncRunnable(data)).start();
new Thread(new IncRunnable(data)).start();

//减1线程,2个
new Thread(new DecRunnable(data)).start();
new Thread(new DecRunnable(data)).start();
}

}

class Data {

private int j = 10;

public synchronized void inc () {
j++;
System.out.println(Thread.currentThread().getName()+"-inc:"+j);
}

public synchronized void dec () {
j--;
System.out.println(Thread.currentThread().getName()+"-dec:"+j);
}

}


class IncRunnable implements Runnable {

private Data data;

public IncRunnable (Data data) {
this.data = data;
}

@Override
public void run() {
for (int i = 0; i < IncDecThread2.TEST_COUNT; i++) {
data.inc();
}
}

}


class DecRunnable implements Runnable {

private Data data;

public DecRunnable (Data data) {
this.data = data;
}

@Override
public void run() {
for (int i = 0; i < IncDecThread2.TEST_COUNT; i++) {
data.dec();
}
}

}


相关标签: 多线程 java