2012-07-06 55 views
0

在工作中训练,我正在写一个Java(其中我有经验0)程序应满足以下条件:如何添加的Java多线程

写可复制分布式计算应用

程序其包含M个随机数的列表

创建中央“调度”对象

创建从调度器检索数N处理器线程然后循环,请求另一个号码

之前多次

如果调度程序中没有可用的号码,请等待请求另一个号码。

如果没有更多的数字,所有的线程应该结束。

到目前为止,我创建了一个随机数组的对象,但我真的不知道如何进行多线程。有人可以引导我通过它吗?这是我迄今为止,以及注释表明伪代码。

public class ThreadDemo extends Thread 
{ 
    //create new array of arbitrary size 5 
    static int SIZE = 5; 
    static int[] myIntArray = new int[SIZE]; 


    public ThreadDemo() 
    { 
     start(); 
    } 

    class RunnableThread implements Runnable { 

     Thread runner; 
     public RunnableThread() { 
     } 
     public RunnableThread(String threadName) { 
      runner = new Thread(this, threadName); // (1) Create a new thread. 
      System.out.println(runner.getName()); 
      runner.start(); // (2) Start the thread. 
     } 
     public void run() { 
      //Display info about this particular thread 
      System.out.println(Thread.currentThread()); 
     } 
    } 


    public static void main(String[] args) 
    { 
     for(int i=0; i<SIZE; i++) 
     { 
      myIntArray[i] = (int)(Math.random() * 10); 
     } 

     ThreadDemo scheduler = new ThreadDemo(); 

     //create M processor threads that retrieve number from scheduler 
      //for(int i=0; i<SIZE; i++) 
       // 

     //if no threads available 
      //make the scheduler thread wait() ?? 

     //if empty 
      //stop() the scheduler thread ?? 

    } 

    } 

任何人都可以引导我走向正确的方向吗?

谢谢!

+0

这个问题的说法有点奇怪。如果确切地有M个数字和M个线程,那么每个线程将选取一个数字,然后终止。最后两个约束是什么? – Tudor 2012-07-06 13:32:22

+0

对不起,我犯了一个错字。实际上有M个随机数和N个处理器线程。 – TimeBomb006 2012-07-06 13:57:54

回答

2

作为第一个指针:不要在构造函数启动线程,并且不使用Runnable对象使用自己启动一个线程。阅读代码的人很困惑。

这里是我拿到这个问题(希望我没有得意忘形):

class Scheduler { 
    private int[] numbers; 
    private AtomicInteger current = new AtomicInteger(); 

    public Scheduler(int count) { 
     Random rand = new Random(); 
     numbers = new int[count]; 
     for(int i = 0; i < count; i++) { 
      numbers[i] = rand.nextInt(); 
      if(numbers[i] < 0) numbers[i] *= -1; 
     } 
    } 

    public int getNextNumber() { 
     int local = current.incrementAndGet(); 
     if(local >= numbers.length) { 
      return -1; 
     } 
     return numbers[local]; 
    } 
} 

首先,我们定义Scheduler类,用于保存随机(正)的整数数组,并从返回一个数字该阵列按需增加,基于原子增量计数器。

class Task implements Runnable { 

    private Scheduler scheduler; 

    public Task(Scheduler scheduler) { 
     this.scheduler = scheduler;  
    } 

    public void run() { 
     while(true) {   
      int limit = scheduler.getNextNumber(); // get next number 
      if(limit == -1) return; // no more numbers 
      System.out.println(limit); 
      for(int i = 0; i < limit; i++) { 
       // spin 
      } 
     } 
    }  
} 

Task类保存每个线程执行的代码。每个线程无限循环地从Scheduler请求数字,直到数组耗尽。

public class Test { 

    public static void main(String[] args) throws InterruptedException { 

     Scheduler s = new Scheduler(100); 
     ExecutorService exec = Executors.newFixedThreadPool(4); 
     for(int i = 0; i < 4; i++) { 
      exec.submit(new Task(s)); 
     } 

     exec.shutdown(); 
     exec.awaitTermination(Long.MAX_VALUE, TimeUnit.DAYS);  
    } 
} 

在主类中,我们设置了一个线程池并执行4个线程来完成上述任务。

+0

谢谢你的提示和解释。直观地看到问题和代码有助于我比参考文档更好地理解代码,尽管这两者都是很好的资源。 – TimeBomb006 2012-07-06 13:34:59

1

你可能想看看TE ThreadPoolExecutor

你应该像这样结束了。

public static void main(){ 
    ThreadPoolExecutor tpe = new ThreadPoolExecutor(...); 
    List<Integer> numbers = getNumberList(); 
    for(Integer i : numbers){ 
    tpe.submit(new MyRunnable(i) { 
      Integer i; 
      public MyRunnable(Integer i){ 
       this.i=i; 
      } 
     @Override 
     public void run() { 
     dosomethingWith(i); 
     } 
     } 
    } 

}