我对线程失去了理智

Im losing my mind with threads

我想要这个class的对象:

public class Chromosome implements Runnable, Comparable<Chromosome> {
    private String[] chromosome;
    public double fitness;
    private Random chromoGen;

    public Chromosome(double[] candidate) {
        super();
        //encode candidate PER parameter; using Matrix as storage
        chromosome = encode(candidate);
        chromoGen = new Random();
    }

    //De-fault
    public Chromosome() {
        super();
        chromoGen = new Random();

        //de-fault genotype
        chromosome = new String[6];
    }

    /**
     * IMPLEMENTED
     */
    public void run() {
        //I hope leaving it empty works...
    }

    public int compareTo(Chromosome c) {
        return (int) (fitness - c.fitness);
    }

    /**
     * Fitness stored in chromosome!
     */
    public void setFitness(ArrayList<double[]> target) {
        fitness = FF.fitness(this, target);
    }

    public double getFitness() {
        return fitness;
    }

    /**
     * ENCODERS/DECODERS
     */
    public String[] encode(double[] solution) {
        //subtract 2^n from solution until you reach 2^-n

        /**
         * LENGTH: 51 BITS!!
         *
         * 1st BIT IS NEGATIVE/POSITIVE
         *
         * THE PRECISION IS [2^30 <-> 2^-20]!!!
         *
         * RANGE: -2.14748...*10^9 <-> 2.14748...*10^9
         */
        String[] encoded = new String[6];

        //PER PARAMETER
        for (int j = 0; (j < 6); j++) {
            encoded[j] = encode(solution[j]);
        }

        return encoded;
    }

    public String encode(double sol) {
        /**
         * THE PRECISION IS [2^30 <-> 2^-20]!!!
         */
        double temp = sol;
        String row = "";
        //NEGATIVITY CHECK
        if (temp < 0) {
            //negative
            row = "1";
        } else {
            //positive
            row = "0";
        }
        //main seq.
        for (int n = 30; (n > (-21)); n--) {
            if ((temp - Math.pow(2, n)) >= 0) {
                temp = temp - Math.pow(2, n);
                row = row + "1";
            } else {
                row = row + "0";
            }
        }
        return row;
    }

    public double decoded(int position) {
        //returns UN-ENCODED solution
        double decoded = 0.00;
        char[] encoded = (chromosome[position]).toCharArray();
        /**
         * [n?][<--int:30-->][.][<--ratio:20-->]
         */
        int n = 30;
        for (int i = 1; (i < encoded.length); i++) {
            if (encoded[i] == '1') {
                decoded += Math.pow(2, n);
            }
            //next binary-place
            n--;
        }
        //NEGATIVE??
        if (encoded[0] == '1') {
            decoded = ((-1) * decoded);
        }
        //Output
        return decoded;
    }

    /**
     * GETTERS
     * ---------------\/--REDUNDANT!!
     */
    public double getParameter(int parameter) {
        //decoded solution
        return decoded(parameter);
    }

    /**
     * Used in E-algrm.
     */
    public String getRow(int row) {
        //encoded solution
        return chromosome[row];
    }

    /**
     * SETTERS
     */
    public void setRow(String encoded, int row) {
        chromosome[row] = encoded;
    }

    public void setRow(double decoded, int row) {
        chromosome[row] = encode(decoded);
    }

    /**
     * MUTATIONS
     */
    public void mutate(double mutationRate) {
        //range of: 51
        double ran = 0;
        int r;
        char[] temp;
        for (int m = 0; (m < 6); m++) {
            temp = (chromosome[m]).toCharArray();
            ran = chromoGen.nextDouble();
            if (ran <= mutationRate) {
                r = chromoGen.nextInt(51);
                if (temp[r] == '1') {
                    temp[r] = '0';
                } else {
                    temp[r] = '1';
                }
            }
            //output
            chromosome[m] = new String(temp);
        }
    }
}

...在单独的线程中;但是我不需要方法 run();但是当我尝试这样做时:

child1 = new Chromosome();
(new Thread(child1)).start();

不过,我在 运行 时看到的唯一线程是 main()。 那么,我怎样才能让它成为独立的线程呢??

当你调用Thread.start()时,新线程会从执行运行()方法开始,你应该在运行()中写下线程要做的事情方法,在 Thread 完成 运行() 方法后终止,因此它不再 运行ning 或可见。

当你有空的 运行() 方法时,它会立即完成,因为它没有任何作用。 线程应该做什么,应该调用什么?只需将该调用放入 运行() 方法即可。

试试这个,也许它会像你期望的那样工作,但我只是猜测你想将你在构造函数中处理的内容移动到一个线程中。

public class Chromosome implements Runnable, Comparable<Chromosome>
{
private String[] chromosome;
public double fitness;
private Random chromoGen;
private double[] candidate;


public Chromosome(double[] candidate)
{        
    super();
    this.candidate=candidate;

}
//De-fault
public Chromosome()
{
    super();

}

/**
 * IMPLEMENTED
 */
public void run()
{
    if (candidate!=null) {
        //encode candidate PER parameter; using Matrix as storage
        chromosome = encode(candidate);
        chromoGen = new Random();
    } else {

        chromoGen = new Random();

        //de-fault genotype
        chromosome = new String[6];
    }
}


public int compareTo(Chromosome c)
{
    return (int)(fitness - c.fitness);
}

/**
 * Fitness stored in chromosome!
 */
public void setFitness(ArrayList<double[]> target)
{
    fitness = FF.fitness(this, target);
}

public double getFitness()
{
    return fitness;
}

/**
 * ENCODERS/DECODERS
 */
public String[] encode(double[] solution)
{
    //subtract 2^n from solution until you reach 2^-n

    /**
     * LENGTH: 51 BITS!!
     * 
     * 1st BIT IS NEGATIVE/POSITIVE
     * 
     * THE PRECISION IS [2^30 <-> 2^-20]!!!
     * 
     * RANGE: -2.14748...*10^9 <-> 2.14748...*10^9
     */
    String[] encoded = new String[6];

    //PER PARAMETER
    for (int j = 0; (j < 6); j++){
        encoded[j] = encode(solution[j]);
    }

    return encoded;
}

public String encode(double sol)
{
    /**
     * THE PRECISION IS [2^30 <-> 2^-20]!!!
     */
    double temp = sol;
    String row = "";
    //NEGATIVITY CHECK
    if (temp < 0){
        //negative
        row = "1";
    }
    else{
        //positive
        row = "0";
    }
    //main seq.
    for (int n = 30; (n > (-21)); n--){
        if ((temp - Math.pow(2, n)) >= 0){
            temp = temp - Math.pow(2, n);
            row = row+"1";
        }
        else{
            row = row+"0";
        }
    }
    return row;
}

public double decoded(int position)
{
    //returns UN-ENCODED solution
    double decoded = 0.00;
    char[] encoded = (chromosome[position]).toCharArray();
    /**
     * [n?][<--int:30-->][.][<--ratio:20-->]
     */
    int n = 30;
    for (int i = 1; (i < encoded.length); i++){
        if (encoded[i] == '1'){
            decoded += Math.pow(2, n);
        }
        //next binary-place
        n--;
    }
    //NEGATIVE??
    if (encoded[0] == '1'){
        decoded = ((-1)*decoded);
    }
    //Output
    return decoded;
}

/**
 * GETTERS
 * ---------------\/--REDUNDANT!!
 */
public double getParameter(int parameter)
{
    //decoded solution
    return decoded(parameter);
}

/**
 * Used in E-algrm.
 */
public String getRow(int row)
{
    //encoded solution
    return chromosome[row];
}

/**
 * SETTERS
 */
public void setRow(String encoded, int row)
{
    chromosome[row] = encoded;
}

public void setRow(double decoded, int row)
{
    chromosome[row] = encode(decoded);
}

/**
 * MUTATIONS
 */
public void mutate(double mutationRate)
{
    //range of: 51
    double ran = 0;
    int r;
    char[] temp;
    for (int m = 0; (m < 6); m++){
        temp = (chromosome[m]).toCharArray();
        ran = chromoGen.nextDouble();
        if (ran <= mutationRate){
            r = chromoGen.nextInt(51);
            if (temp[r] == '1'){
                temp[r] = '0';
            }
            else{
                temp[r] = '1';
            }
        }
        //output
        chromosome[m] = new String(temp);
    }
}
}

我发现您对线程工作原理的理解有问题。

创建线程时,它会查找方法 run()。有几种创建线程的方法。我通过传递一个 Runnable 对象来做到这一点。

Thread t=new Thread (new Runnable);

你知道一个线程有多长吗?

  • 只要方法 run() 存在并运行,线程就会存在。线程只执行 run() 方法中的代码。它不是为了在 run() 之外执行任何事情而设计的。当控件移出 run().
  • 时线程终止

您的情况:

您将 run() 方法留空了。因此,线程什么都不执行,并在创建时死亡。

你能做什么?

将程序的其余部分包含在 run() 中,以便 run() 保留在堆上,因此,新创建的线程运行程序。

您不需要将所有内容都放入 run(),您只需将第一个方法调用转移到 run(),以便它保留在堆上。

举个例子:

public class threading implements Runnable
{
     public static void main(String args[])
     {
       Thread t = new Thread (new Runnable);
        t.setName("thread1");
        t.start();
         print1();
         print2();

     }    
      public static void print2()
      {
      System.out.println(Thread.getName());
       }
       public static void print1()
      {
      System.out.println(Thread.getName());
       }
       public void run()
       {
      System.out.println(Thread.getName());
       }
}

输出:

  • 线程 1
  • 主要
  • 主要

是时候让你的新线程一直活跃到最后了。

public class threading implements Runnable
{
     public static void main(String args[])
     {
       Thread t = new Thread (new Runnable);
        t.setName("thread1");
        t.start();


     }    
      public static void print2()
      {
      System.out.println(Thread.getName());
       }
       public static void print1()
      {
      System.out.println(Thread.getName());
       print2();
       }
       public void run()
       {
      System.out.println(Thread.getName());
        print1();
       }
}

输出:

  • 线程 1
  • 线程 1
  • 线程 1

我们通过在 run() 中调用方法将方法 run() 保留在堆上。这种方法是进一步保持流量的方法。

我认为你的线程很好并且必须工作,但是你的 run 方法是空的并且线程在你没有注意到的情况下终止了

试试这个:

public void run()
{
    System.out.println("I hope leaving it empty works...");
}

如果您在 console 中看到消息,那么一切都很好,您只需要在 run 方法中添加一个 condition/loop/logic,这样它就不会在之前被终止你完成了工作。