使用JDK自带的线程池类ExecutorService 计算数字

CapJes 发布于 2013/08/18 23:20
阅读 545
收藏 0

使用JDK自带的线程池类,实现计算数字的DEMO。出现结果不正确。

帮忙瞅瞅。

package com.thread;

public class SourceClass {
	public static int num = 0;
	public static boolean lock = false;
}
package com.thread;

public class ThreadClass extends Thread {
	private String threadSign;
	public ThreadClass(String threadSign) {
		this.threadSign = threadSign;
	}

	public void run() {
		if (!SourceClass.lock) {
			System.out.println("RUN="+threadSign);
			SourceClass.lock = true;
			System.out.println(threadSign);
			SourceClass.num = SourceClass.num + 1;
			SourceClass.lock = false;
			System.out.println(SourceClass.num);
		} else {
			System.out.println("Sleep=:"+threadSign);
			try {
				this.sleep(10);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
}
package com.thread;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ThreadPool {
	public void start(){
		ExecutorService executorService = Executors.newFixedThreadPool(10);
		for (int i = 0; i < 10; i++) {
			Thread thread = new ThreadClass("Thread-"+(i+1));
			executorService.execute(thread);
		}
		executorService.shutdown();
	}
	
	public static void main(String[] args) {
		new ThreadPool().start();
		System.out.println("数据结果");
		System.out.println("---"+SourceClass.num);
	}
}

加载中
0
小白小霸王
小白小霸王
java.util.concurrent.atomic.AtomicInteger

可以用原子方式更新的 int 值。有关原子变量属性的描述,请参阅 java.util.concurrent.atomic 包规范。AtomicInteger 可用在应用程序中(如以原子方式增加的计数器),并且不能用于替换 Integer。但是,此类确实扩展了 Number,允许那些处理基于数字类的工具和实用工具进行统一访问。 

[摘抄自jdk.api]


0
袁不语
袁不语
考虑一下num和lock的内存可见性。
0
typeorigin
typeorigin
这个  SourceClass.lock 是自制的锁吧,你是想在临界区内对变量操作吧
0
typeorigin
typeorigin

你可以这样

public class SourceClass{

    public static int num = 0;

    public static final Boolean lock = false;  // 讲 lock 装箱变成对象,方便后面上锁


}
然后

public class ThreadClass extends Thread {
    private String threadSign;
    public ThreadClass(String threadSign) {
        this.threadSign = threadSign;
    }

    public void run() {
        synchronized (SourceClass.lock) {   // 在lock 上同步
            System.out.println("RUN=" + threadSign);
            System.out.println(threadSign);
            SourceClass.num = SourceClass.num + 1;
            System.out.println(SourceClass.num);
        }

    }
}
最后一个类不用改。然后你再试试

返回顶部
顶部