package WiFiControl;
import java.util.Arrays;
import java.util.concurrent.atomic.AtomicInteger;
public class cNum2 {
private final int szArray = 10000000;
private final int nMax = (int) Math.sqrt( szArray);
private final byte[] array = new byte[szArray+1];
private final int szThread =4;
private final chkThread[] threads = new chkThread[szThread];
private final AtomicInteger ptr = new AtomicInteger(2);
public cNum2(){
Arrays.fill(array,(byte)1);
for(int i=0;i<szThread;i++) threads[i] = new chkThread();
}
// private boolean ensure(int p){
// for(chkThread thread : threads){
// while(thread.p < p) Thread.yield();
// }
// return (array[p]==0);
// }
void start(){
for(chkThread thread : threads){
thread.start();
}
}
void waitall(){
for(chkThread thread : threads){
if(thread.isAlive())
try {
synchronized (thread) {
thread.wait();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
int size(){
int sum = 0;
for(int i = 2 ; i< szArray; i++){
sum += array[i];
}
return sum;
}
class chkThread extends Thread {
//private volatile int p = 0;
public void run(){
long t = System.currentTimeMillis();
System.out.println("Thread-"+getId() + ":start, t=" + t);
while(true){
int p = ptr.getAndIncrement();
if(p> nMax) break;
//ensure(p);
if (array[p]==0) continue;
int i = p;
while(true){
p += i;
if(p <= szArray) array[p]=0;
else break;
}
}
synchronized (threads) {
threads.notify();
}
System.out.println("Thread-"+getId() + ":end, p=" + 0 +", t=" + (System.currentTimeMillis()-t));
}
}
public static void main(String [] args){
cNum2 obj = new cNum2();
obj.start();
obj.waitall();
System.out.println(obj.size());
}
}