2

溶液を含む母集団の混合と摂動に基づくプログラムを作成していますVector

そこでfor loop、ユーザーが指定した一定時間後に停止する を作成しました。 ループ内で 5 つのプロシージャを呼び出します。各プロシージャをスレッドに配置すると、プログラムは通常のメソッドを呼び出すよりも多くのソリューションを同時に作成できると思いました。

Thread.stopここで 5 は 5 つのスレッドを作成しましたが、それらを開始すると、 、Thread.suspendThread.interruptまたはを使用しても停止したくありません。Thread.destroy

これが私のコードです。あなたのアイデアを手伝ってもらえますか?

新しい変数を挿入しました:

public volatile boolean CrossOpb = true;`

これが私のコードです:

Thread CrossOp = new Thread(new Runnable() {
public void run() {
   while(CrossOpb == true){
    int rdmCross2=(int) (Math.random() * allPopulation.size())  ; // Crossover 1st vector
    int rdmCross1=(int) (Math.random() * allPopulation.size())  ;
    Vector muted = new Vector();
    Vector copy = copi((Vector) allPopulation.get(rdmCross2));
    Vector callp = copi((Vector) allPopulation.get(rdmCross1));
    muted = crossover(callp, copy);
    System.out.println("cross over Between two Randoms ----------->");
    affiche_resultat(muted);
    allPopulation.add(muted);
   }
}

});

ループ:

CrossOp.setDaemon(true);

int loop = 1;
long StartTime = System.currentTimeMillis() / 1000;
for (int i = 0; i < loop; ++i) { 
    loop++;
    if (timevalue < ((System.currentTimeMillis() / 1000) - StartTime)) {
        loop = 0;
     CrossOpb = false;   
    }
CrossOp.start();
}
4

3 に答える 3

1

Thread特定の時間 aを実行する方法:

基本的なアプローチは、 が実行された時間を計算しThread、終了して結果を返すことです。ここでは、Thread実行された時間の詳細を示します。

注:メソッドで呼び出すたびにSystem.nanoTime()asを使用する必要があります。System.currentTimeMillis()

数字を使用してRandom、それぞれの異なるライフタイムを計算します。これにより、指定された時間に正確Callablesに実行されるわけではありませんが、非常に近く、少なくとも私のマシンでは、デルタの分散はかなり一貫しています。 .

簡単にアクセスできるように、以下のコードの要点を次に示します

package com.stackoverflow.Q18818482;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Random;
import java.util.concurrent.*;

public class Question18818482
{
    public static Random RND;

    static
    {
        RND = new Random();
    }

    public static void main(final String[] args)
    {
        try
        {
            final ExecutorService es = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
            final List<Future<String>> results = new ArrayList<>(10);
            for (int i = 0; i < 10; i++)
            {
                results.add(es.submit(new TimeSliceTask(RND.nextInt(10), TimeUnit.SECONDS)));
            }
            es.shutdown();
            while(!results.isEmpty())
            {
                final Iterator<Future<String>> i = results.iterator();
                while (i.hasNext())
                {
                    final Future<String> f = i.next();
                    if (f.isDone())
                    {
                        System.out.println(f.get());
                        i.remove();
                    }
                }
            }
        }
        catch (InterruptedException e)
        {
            throw new RuntimeException(e);
        }
        catch (ExecutionException e)
        {
            throw new RuntimeException(e);
        }
    }

    public static class TimeSliceTask implements Callable<String>
    {
    private final long timeToLive;
    private final long duration;


    public TimeSliceTask(final long timeToLive, final TimeUnit timeUnit)
    {
        this.timeToLive = System.nanoTime() + timeUnit.toNanos(timeToLive);
        this.duration = timeUnit.toMillis(timeToLive);
    }

    @Override
    public String call() throws Exception
    {
        while( timeToLive <= System.nanoTime() )
        {
            // simulate work here
            Thread.sleep(500);
        }
        final long end = System.nanoTime();
        return String.format("Finished Elapsed Time = %d, scheduled for %d", TimeUnit.NANOSECONDS.toMillis(timeToLive - end), this.duration );
    }
    }
}

実行時の出力は次のようになります

注: すべての時間はミリ秒単位です

Finished Elapsed Time = 999, scheduled for 1000
Finished Elapsed Time = 2998, scheduled for 3000
Finished Elapsed Time = 5999, scheduled for 6000
Finished Elapsed Time = 1994, scheduled for 2000
Finished Elapsed Time = 8994, scheduled for 9000
Finished Elapsed Time = 6993, scheduled for 7000
Finished Elapsed Time = 6993, scheduled for 7000
Finished Elapsed Time = 5993, scheduled for 6000
Finished Elapsed Time = 5998, scheduled for 6000
于 2013-09-16T02:09:41.660 に答える
-2

スレッドに関する昨夜の記事をすべて読んだ後、私の問題の解決策はそれほど難しくないことがわかりました。
アイデアは、スレッド内の停止ループの条件を編集することでした。そのため、実行する特定の時間を与えることで制御します。これが私の例です:

class ProcessorCordm extends Thread {
    int runningtime;
    public ProcessorCordm(int runningtime) {
        this.runningtime = runningtime;
    }
    public void run() {
        int loop = 1;
        long StartTime = System.currentTimeMillis() / 1000;
        for (int i = 0; i < loop; ++i) {
            int rdmCross2 = (int) (Math.random() * allPopulation.size()); // Crossover 1st vector
            int rdmCross1 = (int) (Math.random() * allPopulation.size());
            Vector muted = new Vector();
            Vector copy = copi((Vector) allPopulation.get(rdmCross2));
            Vector callp = copi((Vector) allPopulation.get(rdmCross1));
            muted = crossover(callp, copy);
            System.out.println("cross over Between two Randoms ----------->");
            affiche_resultat(muted);
            addsolution(muted);
            loop++;
            if (timevalue < ((System.currentTimeMillis() / 1000) - StartTime)) {
                loop = 0;
            }
        }
    }
}

したがって、スレッド10 秒間実行したい場合は、次の ことだけを行う必要があります。

 ProcessorCoG CrossOpg = new ProcessorCoG(10);

私の場合、特定のTimeValueExecutorServiceに対して同時に動作する多くの Threads を呼び出す必要があるため、 Classを使用しました。

            ProcessorCoG CrossOpg = new ProcessorCoG(timevalue);//extends Thread class
            ProcessorCordm CrossOp = new ProcessorCordm(timevalue);//extends Thread class
            ProcessorCordm CrossOp2 = new ProcessorCordm(timevalue);//extends Thread class
            MutateGb MutGb = new MutateGb(timevalue);//extends Thread class
            MutateRdm MutRdm = new MutateRdm(timevalue);//extends Thread class
            MbsRdm MbsR = new MbsRdm(timevalue);//extends Thread class
            ExecutorService executor = Executors.newFixedThreadPool(6);
            executor.submit(MutGb);
            executor.submit(MutRdm);
            executor.submit(CrossOp);
            executor.submit(CrossOp2);
            executor.submit(CrossOpg);
            executor.submit(MbsR);
于 2013-09-17T15:41:47.967 に答える