开发者

Java Thread Yielding/ Starvation Problem

I'm writing a code that will run a multithreaded bank. I first create an array of threads with one program, then pass them into another thread that runs a loop to start them. For part of the application, I have a CPU intensive method that basical开发者_如何学Goly runs a series of loops within one another. Only problem is, for some reason it is not yielding the way that I think it should. Here is the code that is running the threads:

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++;
    }

    }

Then here is the Jumbler run method:

    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);
}

So, the problem is that I want it to yield, allowing the main method to continue running more threads, but it blocks and waits for the Jumbler to complete (which takes a long time). Any idea why that would happen or how to fix it?


I suppose the issue comes with transactions[copy].run(); in your main loop. This one calls the run method directly but not in another system thread. Instead start the thread with transactions[copy].start();.


It seems that you're spawning the thread correctly (in fact, you're not spawning them at all)

If you want a Thread to start running (concurrently to the current thread) you need to call the start() method of that Thread object, which you don't.

If I understand your code correctly, you want the first snippet to spawn the other threads. Therefore you should change transactions[copy].run() to transactions[copy].start().

(This an educated guess. It would be nice if you showed the definition of the transaction array.)

Here's the typical scheme of launching several Threads:

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();


Once the thread is running, i don't think you can be guaranteed that priority changes when you call setPriority.

these two statements do the same thing:

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

but you probably shouldn't be calling yield, let the os do that.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜