我希望你們都做得很好。所以來到這個問題。我的這部分代碼:當線程處於活動狀態時(Runnable)狀態不正常
private static ArrayList<String> primelist = new ArrayList<>();
static void addToList(String list_elm) {
primelist.add(list_elm);
}
基本上這個名單是由我在全碼(見下文)創建的線程的倍數併發訪問,而這些都是負責做一些計算和返回結果然後通過調用方法addToList(String list_elm)
將其添加到此primelist
。
但是,在所有線程被終止(即:完成他們的工作)之後,在primelist
中存在一些空值。因此經過一番研究,結果發現ArrayList不是一個線程安全的類,因此也不是它的方法。我想問一下以下(也許很深)的問題:
當線程執行一行代碼時它會被放入(等待//等待的時間)中,也就是說它調用方法addToList(String list_elm)
並且它到達了primelist.add(list_elm);
行,但是在添加元素時恰好停止!
如果不是,請您澄清我對(特別是)ArrayList案件的困惑。 ((基本上是怎麼回事^^)?)
全碼:
import java.util.ArrayList;
import java.util.Iterator;
public class CreatingAThreadThree
{
private static ArrayList<String> primelist = new ArrayList<>();
static void addToList(String list_elm)
{
primelist.add(list_elm);
}
static ArrayList<String> getListReference(){
return primelist;
}
public static void main(String[] args)
{
for(long x = 6223372036854775899L; x<=(6223372036854775999L); x+=2)
{
new Thread (new MyCalcRunnable(x)).start();
}
for(long x = 9223372036854774703L; x<=9223372036854774789L; x+=2)
{
new MyCalcThread(x, "myChildThread"+x);
}
Thread mainThread = Thread.currentThread();
int spinner =0;
char animation = ' ';
System.out.println("Total number of active threads: " + Thread.activeCount());
System.out.print("Calculating primes: ");
while(Thread.activeCount() >1)
{
spinner ++;
switch(spinner)
{
case 1:
animation = '|';
break;
case 2:
animation = '/';
break;
case 3:
animation = '-';
break;
case 4:
animation = '\\';
spinner = 0;
break;
}
System.out.print("\b" + animation);
try
{
Thread.sleep(200);
}catch(InterruptedException ex)
{
}
}
System.out.println("Total number of active threads: " + Thread.activeCount());
System.out.println("Results List:");
Iterator<?> iterator = (getListReference().iterator());
while(iterator.hasNext())
{
System.out.println(iterator.next());
}
}
}
class MyCalcThread extends Thread
{
private long numberToFactor = 0;
MyCalcThread(long numberToFactor, String name)
{
super(name);
this.numberToFactor = numberToFactor;
start();
}
@Override
public void run()
{
CreatingAThreadThree.addToList(new PrimeStuff().isItPrime(this.numberToFactor));
}
}
class MyCalcRunnable implements Runnable
{
private long numberToFactor = 0;
MyCalcRunnable(long numberToFactor)
{
this.numberToFactor = numberToFactor;
}
@Override
public void run()
{
CreatingAThreadThree.addToList(new PrimeStuff().isItPrime(this.numberToFactor));
}
}
class PrimeStuff
{
String isItPrime(long numberToFactor)
{
if(numberToFactor % 2 == 0)
return (numberToFactor +"is Not prime....divisible by 2");
long squareRoot = (long)(Math.sqrt(numberToFactor));
for(long i=3; i<squareRoot; i++)
{
if(numberToFactor % i == 0)
{
return (numberToFactor +"is Not prime....first divisible by " + i);
}
}
return (numberToFactor + " is Prime!!");
}
}
這裏有一點需要注意:您想了解一些關於java編碼風格的約定。例如,你不要在普通變量名稱中使用「_」;這些僅適用於SOME_CONSTANT。 – GhostCat
據我所知,在所有字母都是大寫的情況下,常量中使用的是「_」,這在我的代碼中並不是這樣。 –
我的意思是:_僅用於常量。例如,它不像你的list_elem那樣使用。 – GhostCat