Java线程学习小结

来源:互联网 发布:python和node.js 编辑:程序博客网 时间:2024/05/21 10:20
        当多个线程访问同一数据项(如静态字段、可全局访问对象的实例字段或共享集合)时,需要确保
它们协调了对数据的访问,这样它们都可以看到数据的一致视图,而且相互不会干扰另一方的更改。
为了实现这个目的,Java 语言提供了两个关键字:synchronized 和 volatile。
        当从多个线程中访问变量时,必须确保对该访问正确地进行了同步。对于简单变量,将变量声明成
volatile 也许就足够了,但在大多数情况下,需要使用同步。
       如果将要使用同步来保护对共享变量的访问,那么必须确保在程序中所有访问该变量的地方都使
用同步。
      虽然线程可以大大简化许多类型的应用程序,过度使用线程可能会危及程序的性能及其可维护性。
线程消耗了资源。因此,在不降低性能的情况下,可以创建的线程的数量是有限制的。
尤其在单处理器系统中,使用多个线程不会使主要消耗 CPU 资源的程序运行得更快。

以下示例使用两个线程,一个用于计时,一个用于执行实际工作。主线程使用非常简单的算法计算
素数。
在它启动之前,它创建并启动一个计时器线程,这个线程会休眠十秒钟,然后设置一个主线程要检
查的标志。十秒钟之后,主线程将停止。请注意,共享标志被声明成 volatile。


public class CalculatePrimes extends Thread {
public static final int MAX_PRIMES = 1000000;
public static final int TEN_SECONDS = 10000;
public volatile boolean finished = false;
public void run() {
int[] primes = new int[MAX_PRIMES];
int count = 0;
for (int i=2; count<MAX_PRIMES; i++) {
// Check to see if the timer has expired
if (finished) {
break;
}
boolean prime = true;
for (int j=0; j<count; j++) {
if (i % primes[j] == 0) {
prime = false;
break;
}
}
if (prime) {
primes[count++] = i;
System.out.println("Found prime: " + i);
}
}
}
public static void main(String[] args) {
CalculatePrimes calculator = new CalculatePrimes();
calculator.start();
try {
Thread.sleep(TEN_SECONDS);
}


catch (InterruptedException e) {
// fall through
}
calculator.finished = true;
}
}
0 0
原创粉丝点击