Java线程产生/饥饿问题

时间:2011-04-30 19:40:52

标签: java multithreading thread-safety

我正在编写一个运行多线程银行的代码。我首先用一个程序创建一个线程数组,然后将它们传递给另一个运行循环的线程来启动它们。对于应用程序的一部分,我有一个CPU密集型方法,基本上在一个彼此之间运行一系列循环。唯一的问题是,由于某种原因,它没有产生我认为应该的方式。以下是运行线程的代码:

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 run方法:

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

所以,问题是我想让它产生,允许main方法继续运行更多线程,但它阻塞并等待Jumbler完成(这需要很长时间)。知道为什么会发生这种情况或如何解决它?

3 个答案:

答案 0 :(得分:6)

我认为问题在主循环中伴随transactions[copy].run();。这个直接调用run方法而不是另一个系统线程。而是使用transactions[copy].start();启动帖子。

答案 1 :(得分:1)

似乎你正确地产生了线程(事实上,你根本就没有产生它们)

如果你想让一个Thread开始运行(同时到当前线程)你需要调用那个Thread对象的start()方法,你不需要这样做。

如果我正确理解您的代码,您希望第一个代码段产生其他线程。因此,您应该将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();

答案 2 :(得分:-1)

一旦线程运行,我认为当你调用setPriority时,可以保证优先级不会改变。

这两个陈述做同样的事情:

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

但你可能不应该调用yield,让os这样做。