konusundaki konuları kullanıyorum 4 thread'ın bir histogram oluşturmasına izin vermek için kod yazıyorum.Atomic Integer Array
Ben ana bir dizi var:
int N = 10000;
Random r = new Random();
int[] a = new int[N];
for (int i = 0; i < a.length; i++)
{
a[i] = Math.abs(r.nextInt() % 100);
}
Böylece temelde ne yapmak istediğinizi bu dizi boyunca döngüsünü ve her sayı kaç kere göründüğü sayılır.
Konu sınıfım yazdım ve aynı dizine aynı anda erişmeye çalışan birden fazla iş parçacığı sorununun çözülmesine yardımcı olacağını düşündüğüm AtomicInteger
kullandım.
import java.util.concurrent.atomic.AtomicInteger;
public class UseThread implements Runnable
{
private static int[] array;
private static AtomicInteger[] count;
private static boolean[] check;
public UseThread(int[] array, AtomicInteger[] count)
{
this.array = array;
this.count = count;
this.check = new boolean[array.length];
}
public void run()
{
for (int i = 0; i < array.length; i++)
{
if (!getIndex(this.check[i]))
{
this.check[i] = true;
int number = array[i];
count[number].incrementAndGet();
}
}
}
public synchronized static boolean getIndex(boolean check2)
{
return check2;
}
Ancak, bu benim sorunumu tam olarak düzeltmedi. Konuların bazıları diziye aynı anda erişiyor, count
dizisini yapıyor, array
dizisinin uzunluğundan daha büyük bir değer tutuyor.
Sorunun, boole denetim dizisinde olduğunu düşünüyorum. Birden çok iş parçacığının aynı boole dizisi dizinine aynı anda eriştiğini hissediyorum.
Belki de basit bir düzeltme olduğunu düşünüyorum, ancak göremiyorum.
Herhangi bir öneri?
AtomicBoolean
dizisini denedim, ancak yardımcı olmadı. Aşağıda aynı sınıf ama uygulanan AtomicBoolean
dizisi var.
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
public class Assign7Q3 implements Runnable
{
private static int[] array;
private static AtomicInteger[] count;
private static AtomicBoolean[] check;
public Assign7Q3(int[] array, AtomicInteger[] count)
{
this.array = array;
this.count = count;
this.check = new AtomicBoolean[array.length];
for(int i = 0; i < check.length; i ++)
check[i] = new AtomicBoolean(false);
}
public void run()
{
for (int i = 0; i < array.length; i++)
{
//System.out.println(this.check[i].get());
if (!getIndex(this.check[i]))
{
this.check[i].set(true);
int number = array[i];
count[number].incrementAndGet();
}
}
}
public synchronized static boolean getIndex(AtomicBoolean check2)
{
return check2.get();
}
Sorun * açıklamayı ister misiniz? –
Sanırım sorun kontrolün “boolean” kontrol dizisinde. Birden çok iş parçacığının aynı "boolean" denetim dizisi dizinine aynı anda eriştiğini hissediyorum. @YassinHajaj –
Doğru. Onu 'AtomicBoolean' olarak değiştirin, evet? –