初学者 |线程池 |打印出每一个结果 |错误的结果
beginner | threadPool | printout every result | wrong result
我试图通过每个线程将 "global counter" 加 1。所以"global counter"的结果一定是10。
我打印出每个线程结果。大多数时候最后的结果是 10。但有时 10 不是最后一个数字。我用了synchronized或者lock,但是没用
谢谢。希望我的英文不会太差
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Hauptprogramm {
public static final int MAX_THREADS = 10;
public static int globalCounter;
public static void main(String[] args) {
// create a pool of threads, 10 max jobs will execute in parallel
ExecutorService threadPool = Executors.newFixedThreadPool(MAX_THREADS);
// submit jobs to be executing by the pool
for (int i = 0; i < MAX_THREADS; i++) {
threadPool.submit(new Runnable() {
public void run() {
// some code to run in parallel
globalCounter++;
String originalName = Thread.currentThread().getName();
System.out.println("Result: "+globalCounter+" "+originalName);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
}
});
}
threadPool.shutdown();
}
}
我不知道这次测试的预期是什么,因为我还没有 50 的声誉,我不能添加评论。
Java线程在JVM中是运行,无法从高层控制资源分配,如果要求有线程依次开始执行,使用release-lock机制,但是不能保证它会按顺序执行,如果你要求按顺序执行,你需要做一些逻辑来识别哪个线程需要一个接一个地执行。
我认为现在是:
public void run() {
synchronized(Hauptprogramm.class)
{
globalCounter++;
String originalName = Thread.currentThread().getName();
System.out.println("Result: " + globalCounter + " " + originalName);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
}
}
}});
}
threadPool.shutdown();
}
}
我试图通过每个线程将 "global counter" 加 1。所以"global counter"的结果一定是10。 我打印出每个线程结果。大多数时候最后的结果是 10。但有时 10 不是最后一个数字。我用了synchronized或者lock,但是没用
谢谢。希望我的英文不会太差
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Hauptprogramm {
public static final int MAX_THREADS = 10;
public static int globalCounter;
public static void main(String[] args) {
// create a pool of threads, 10 max jobs will execute in parallel
ExecutorService threadPool = Executors.newFixedThreadPool(MAX_THREADS);
// submit jobs to be executing by the pool
for (int i = 0; i < MAX_THREADS; i++) {
threadPool.submit(new Runnable() {
public void run() {
// some code to run in parallel
globalCounter++;
String originalName = Thread.currentThread().getName();
System.out.println("Result: "+globalCounter+" "+originalName);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
}
});
}
threadPool.shutdown();
}
}
我不知道这次测试的预期是什么,因为我还没有 50 的声誉,我不能添加评论。
Java线程在JVM中是运行,无法从高层控制资源分配,如果要求有线程依次开始执行,使用release-lock机制,但是不能保证它会按顺序执行,如果你要求按顺序执行,你需要做一些逻辑来识别哪个线程需要一个接一个地执行。
我认为现在是:
public void run() {
synchronized(Hauptprogramm.class)
{
globalCounter++;
String originalName = Thread.currentThread().getName();
System.out.println("Result: " + globalCounter + " " + originalName);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
}
}
}});
}
threadPool.shutdown();
}
}