/*
* Copyright 2001-2014 Stephen Colebourne
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.joda.time.chrono;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Locale;
import java.util.concurrent.CountDownLatch;
import junit.framework.Assert;
import org.joda.time.DateTimeZone;
/**
* This class is a testing class for threading.
*/
public class ThreadContention {
public static void main(String[] args) {
multiThreadGJLocale();
singleThreadGJLocale2();
singleThreadGJLocale();
multiThreadZones();
singleThreadZones();
}
//-------------------------------------------------------------------------
private static void multiThreadGJLocale() {
final CountDownLatch latch = new CountDownLatch(1);
final List<Locale> locales = createLocales();
List<Runnable> runnables = new ArrayList<Runnable>();
for (int i = 0; i < 100; i++) {
Runnable r = new Runnable() {
public void run() {
try {
latch.await();
List<Locale> shuffled = new ArrayList<Locale>(locales);
Collections.shuffle(shuffled);
String name = Thread.currentThread().getName();
for (int j = 0; j < 100; j++) {
for (Locale locale : shuffled) {
GJLocaleSymbols symbols = GJLocaleSymbols.forLocale(locale);
Assert.assertEquals(GJLocaleSymbols.class, symbols.getClass());
}
}
System.out.println("Finished: " + name);
} catch (Exception ex) {
ex.printStackTrace();
System.exit(1);
}
}
};
new Thread(r).start();
runnables.add(r);
}
latch.countDown();
}
private static void singleThreadGJLocale() {
List<Locale> locales = createLocales();
List<Locale> shuffled = new ArrayList<Locale>(locales);
Collections.shuffle(shuffled);
long start = System.nanoTime();
int count = 0;
for (int j = 0; j < 10000; j++) {
for (Locale locale : shuffled) {
GJLocaleSymbols symbols = GJLocaleSymbols.forLocale(locale);
count = count + symbols.getDayOfWeekMaxShortTextLength();
}
}
long end = System.nanoTime();
System.out.println("Finished " + count + " " + (end - start) / 1000000);
}
private static void singleThreadGJLocale2() {
List<Locale> locales = createLocales();
List<Locale> shuffled = new ArrayList<Locale>(locales);
Collections.shuffle(shuffled);
long start = System.nanoTime();
int count = 0;
for (int j = 0; j < 1000000; j++) {
GJLocaleSymbols symbols = GJLocaleSymbols.forLocale(Locale.US);
count = count + symbols.getDayOfWeekMaxShortTextLength() + symbols.hashCode();
}
long end = System.nanoTime();
System.out.println("Finished " + count + " " + (end - start) / 1000000);
}
private static List<Locale> createLocales() {
return Arrays.asList(Locale.getAvailableLocales());
}
//-------------------------------------------------------------------------
private static void multiThreadZones() {
final CountDownLatch latch = new CountDownLatch(1);
final List<DateTimeZone> zones = createZones();
List<Runnable> runnables = new ArrayList<Runnable>();
for (int i = 0; i < 100; i++) {
Runnable r = new Runnable() {
public void run() {
try {
latch.await();
List<DateTimeZone> shuffled = new ArrayList<DateTimeZone>(zones);
Collections.shuffle(shuffled);
String name = Thread.currentThread().getName();
for (int j = 0; j < 100; j++) {
for (DateTimeZone zn : shuffled) {
ISOChronology chrono = ISOChronology.getInstance(zn);
Assert.assertEquals(zn, chrono.getZone());
}
}
System.out.println("Finished: " + name);
} catch (Exception ex) {
ex.printStackTrace();
System.exit(1);
}
}
};
new Thread(r).start();
runnables.add(r);
}
latch.countDown();
}
private static void singleThreadZones() {
List<DateTimeZone> zones = createZones();
List<DateTimeZone> shuffled = new ArrayList<DateTimeZone>(zones);
Collections.shuffle(shuffled);
long start = System.nanoTime();
int count = 0;
for (int j = 0; j < 10000; j++) {
for (DateTimeZone zn : shuffled) {
ISOChronology chrono = ISOChronology.getInstance(zn);
count = count + chrono.getZone().getID().length();
}
}
long end = System.nanoTime();
System.out.println("Finished " + count + " " + (end - start) / 1000000);
}
private static List<DateTimeZone> createZones() {
final List<DateTimeZone> zones = new ArrayList<DateTimeZone>();
for (final String zone : DateTimeZone.getAvailableIDs()) {
zones.add(DateTimeZone.forID(zone));
}
return zones;
}
}