Проблема с потерей урожайности в Java - PullRequest
0 голосов
/ 30 апреля 2011

Я пишу код, который будет запускать многопоточный банк. Сначала я создаю массив потоков с одной программой, а затем передаю их в другой поток, который запускает цикл для их запуска. Для части приложения у меня есть метод с интенсивным использованием процессора, который в основном запускает серию циклов друг в друге. Единственная проблема в том, что по какой-то причине она не уступает так, как мне кажется. Вот код, который запускает потоки:

public void run(){
    this.setPriority(MAX_PRIORITY);
    int count = 0;

    while(count<transactions.length){
        int copy = count;
            if(transactions[copy] instanceof Jumbler){
                System.out.println(copy + " is a jumbler.");
            }
            else{
                System.out.println(copy  + " is not a jumbler");
            }
        transactions[copy].run();
        count++;
    }

    }

Тогда вот метод запуска Jumbler:

    public void run(){
    System.out.println("running jumbler");
    Thread.yield();
    Thread.currentThread().yield();
    try{
        Thread.currentThread().sleep(5000);
    }catch(InterruptedException e){}
    //this.setPriority(MIN_PRIORITY);
    System.out.println("still running.");
    Thread.yield();
    nums = new int[1000];
    int i = 0;

    do{
        Thread.yield();

        for(int x=0;x<1000;x++){
            Thread.yield();
            //System.out.println("in the loop");
            nums[x]=(int)(Math.random()*10000)+1;
            for(int y = 0;y<1000;y++){
                Thread.yield();
                //System.out.println("in the the loop");
                for(int z = 0;z<100;z++){
                    Thread.yield();
                }
            }
        }
        Thread.yield();
        i++;
        System.out.println(whichJumble + ": " + i);
    }while(i<1000);
}

Итак, проблема в том, что я хочу, чтобы он уступил, позволяя основному методу продолжать выполнение большего количества потоков, но он блокирует и ждет завершения Jumbler (что занимает много времени). Любая идея, почему это произойдет или как это исправить?

Ответы [ 3 ]

6 голосов
/ 30 апреля 2011

Полагаю, проблема связана с transactions[copy].run(); в вашем основном цикле. Этот метод вызывает метод run напрямую, но не в другом системном потоке. Вместо этого начните тему с transactions[copy].start();.

1 голос
/ 30 апреля 2011

Кажется, что вы правильно порождаете поток (на самом деле вы вообще его не порождаете)

Если вы хотите, чтобы поток запускался (одновременно с текущим потоком), вам нужно вызвать метод start() этого объекта Thread, чего у вас нет.

Если я правильно понимаю ваш код, вы хотите, чтобы первый фрагмент порождал другие потоки. Поэтому вы должны изменить transactions[copy].run() на transactions[copy].start().

(Это обоснованное предположение. Было бы неплохо, если бы вы показали определение массива transaction.)

Вот типичная схема запуска нескольких потоков:

class MyThread extends Thread {
  public void run() { 
    // Do something here ...
  }
}


// Prepare the array
MyThread[] arr = new MyThread[10];
for(int i = 0; i < arr.length; ++i)
  arr[i] = new MyThread();

...

// Launch the threads
for(int i = 0; i < arr.length; ++i)
  arr[i].start();
0 голосов
/ 30 апреля 2011

Когда поток запущен, я не думаю, что вы можете быть уверены, что приоритет изменяется при вызове setPriority.

эти два оператора делают одно и то же:

Thread.yield();
Thread.currentThread().yield();

, ноВы, вероятно, не должны вызывать yield, пусть ОС сделает это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...