2009-03-02 43 views
3

当谈到Java线程和并发的世界时,我相当天真。我目前正在努力学习。我做了一个简单的例子来试图找出并发性是如何工作的。Java线程教程类型问题

这里是我的代码:

import java.util.concurrent.ExecutorService; 
import java.util.concurrent.Executors; 

public class ThreadedService { 

    private ExecutorService exec; 

    /** 
    * @param delegate 
    * @param poolSize 
    */ 
    public ThreadedService(int poolSize) { 
     if (poolSize < 1) { 
      this.exec = Executors.newCachedThreadPool(); 
     } else { 
      this.exec = Executors.newFixedThreadPool(poolSize); 
     } 
    } 

    public void add(final String str) { 
     exec.execute(new Runnable() { 
      public void run() { 
       System.out.println(str); 
      } 

     }); 

    } 

    public static void main(String args[]) { 
     ThreadedService t = new ThreadedService(25); 
     for (int i = 0; i < 100; i++) { 
      t.add("ADD: " + i); 
     } 
    } 

} 

什么我需要做的,使代码打印出来的顺序号码0-99?

回答

3

对于您的问题最简单的解决方案是使用1的ThreadPool大小。但是,这不是真正的问题,会使用线程来解决。

扩大,如果你创建你的遗嘱执行人:

this.exec = Executors.newSingleThreadExecutor(); 

那么你的线程都将被安排在他们提交执行的顺序执行。有几种情况下这是一件合乎逻辑的事情,但在大多数情况下,线程是用来解决此问题的错误工具。

当你需要在不同的线程中执行任务时,这种事情是有意义的 - 可能需要很长时间才能执行,并且你不想阻塞GUI线程 - 不需要或不希望提交的任务在同一时间运行。

3

线程的想法是不按顺序做事情。

您将需要一些共享状态进行协调。在这个例子中,在这个例子中,将实例字段添加到外部类中。从添加中删除参数。添加一个锁定对象和一个计数器。抓住锁,增加打印号码,增加号码,释放号码。

0

问题是由定义不适合线程。线程独立运行,并且没有真正预测哪个线程首先运行的方法。

如果你想改变你的代码按顺序运行,改变添加到:

public void add(final String str) { 
    System.out.println(str); 
} 

您没有使用线程(不是你自己至少),一切都发生的顺序。

+0

那不是练习的重点..我提供的例子并不是我真正要使用的。我想更好地理解线程和同步。 – systemoutprintln 2009-03-02 21:45:21