Выдает ровно одну перестановку в один момент времени.
Если нужно 16 перестановок, то потребуется 2 в 4 моментов времени на генерацию всех, не больше и не меньше.
Сердце программы это поток-ячейка, содержащая один бит.
Этот бит после запуска приобретает значение то 0 то 1.
Затем поток останавливается на точно определенное время.
Если такт генератора равен 1 сек, то можно например точно сказать:
любое число длиной от 0 до 20 бит будет пройдено за не более чем 1*2 в 20 секунд
package qc;
public class Main
{
public static void main(String[] argv)
{
try
{
int len = 4;
int min_takt = 100;
int num_cycles = 100;
QGThread[] qs = new QGThread[len];
for(int i=0;i<len;i++)
{
qs[i] = new QGThread(min_takt*(int)Math.pow(2.0,(double)(len - i - 1)));
qs[i].start();
}
//work with 4 threads
for(int i=0;i<num_cycles;i++)
{
byte t1 = qs[0].getBit(); //most significant bit
byte t2 = qs[1].getBit();
byte t3 = qs[2].getBit();
byte t4 = qs[3].getBit(); //least significant bit
System.out.println(""+t1+""+t2+""+t3+""+t4);
Thread.sleep(min_takt);
}
//ostanov
for(int i=0;i<len;i++)
{
qs[i].stopQG();
}
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
//===================================
package qc;
public class QGThread extends Thread
{
private byte bit = Const.ONE;
private int takt = Const.UNDEFINED_TIME;
private boolean stop = false;
public QGThread(int t)
{
takt = t;
}
public synchronized void setBit(byte b)
{
bit=b;
}
public synchronized byte getBit()
{
return bit;
}
public synchronized void stopQG()
{
stop=true;
}
public void run()
{
try
{
while(stop==false)
{
if(bit == Const.ONE) bit=Const.ZERO;
else bit=Const.ONE;
Thread.sleep(takt);
}
}
catch(Exception e)
{
e.printStackTrace();
}
}
}