import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicInteger;
public class ExecutorExample1 {
public static void main(String[] args) {
ExecutorService executorService= Executors.newFixedThreadPool(2);
executorService.execute(new MyTask());
executorService.execute(new MyTask());
executorService.execute(new MyTask());
executorService.shutdown();
}
}
class MyTask implements Runnable{
private static AtomicInteger count = new AtomicInteger(0);
@Override
public void run() {
try {
count.addAndGet(1);
task();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
private void task()throws InterruptedException{
System.out.println(count + " Enterd Run of: " + Thread.currentThread().getName());
Thread.sleep(5000);
System.out.println(count + " Executing: " + Thread.currentThread().getName());
Thread.sleep(5000);
System.out.println(count + " Completed Executing: " + Thread.currentThread().getName());
}
}
2输入运行方式:pool-1-thread-12输入运行方式:pool-1-thread-22执行中:pool-1-thread-22执行中:pool-1-thread-12完成的执行:pool-1-thread-12完成的执行:pool-1-thread-23输入运行方式:pool-1-thread-13执行中:pool-1-thread-13完成的执行:pool-1-thread-1
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicInteger;
public class ExecutorExample1 {
public static void main(String[] args) {
ExecutorService executorService= Executors.newFixedThreadPool(2);
executorService.execute(new MyTask());
executorService.execute(new MyTask());
executorService.execute(new MyTask());
executorService.shutdown();
}
}
class MyTask implements Runnable{
//private static AtomicInteger count = new AtomicInteger(0);
private static int count = 0;
@Override
public void run() {
try {
//count.addAndGet(1);
synchronized (MyTask.class){
count+=1;
}
task();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
private void task()throws InterruptedException{
System.out.println(count + " Enterd Run of: " + Thread.currentThread().getName());
Thread.sleep(5000);
System.out.println(count + " Executing: " + Thread.currentThread().getName());
Thread.sleep(5000);
System.out.println(count + " Completed Executing: " + Thread.currentThread().getName());
}
}
2输入运行方式:pool-1-thread-21输入运行方式:pool-1-thread-12执行中:pool-1-thread-22执行中:pool-1-thread-12完成的执行:pool-1-thread-22完成的执行:pool-1-thread-13输入运行方式:pool-1-thread-23执行中:pool-1-thread-23完成的执行:pool-1-thread-2
AtomicInteger
使用引擎盖下的volatile
字段。这是为了确保所有读取器(其他线程)使用最新的值。在第二种情况下使用简单的int
时,您的字段不是volatile
,因此您看到的1
来自陈旧的值。
通过使用volatile
关键字,您应该可以获得相似的结果。
另一种方法是使用门确保继续前进之前满足条件。例如,可以使用CountDownLatch
来实现(还有其他方法):https://www.baeldung.com/java-countdown-latch