Java动态数字线程创建和管理

时间:2012-04-01 17:30:46

标签: java multithreading

我想创建动态的线程数,这取决于数据库的数据库行数。

List list = session.createQuery("From Devices").list();

线程数取决于list.size()。 我正在使用For循环

创建动态线程数
new Thread(){public void run(){/* Task of each thread */}.start();

是否正确创建动态线程数?如果我使用共享变量,我需要定义synchronized ..任何另一个想法如何管理线程计数变为动态并依赖于用户的线程。

另一个问题我如何定义一些私有变量,它被分隔到每个线程而不是相互剪切.. ????

感谢

2 个答案:

答案 0 :(得分:1)

如果你只需要一个线程团队来执行每一行的某些事情,我会改为使用一个线程池:

ExecutorService exec = Executors.newFixedThreadPool(list.size());

提交工作和管理池要比使用一组线程容易得多。

此后,同步取决于实际计算。如果要同时修改某些共享状态(列表,计数器),则需要跨线程同步访问。

最后,要定义具有私有状态的线程任务:

class ThreadTask implements Runnable {

     private int state; // example of private state

     public ThreadTask(int state) {
        this.state = state;
     }

     public void run() {
        // task code
     }
}

答案 1 :(得分:0)

  

是否正确创建动态线程数?

是的,但不是很优雅。考虑创建一个单独的类:

public class DeviceHandler implements Runnable {
  //...
}

然后:

List<Device> list = session.createQuery("From Devices").list();

for(Device device: list) {
  Thread thread = new Thread(new DeviceHandler(device));
  thread.start();
}

请注意,我假设每个线程都负责一个设备,所以我急切地将Device实例传递给每个线程。你需要它,相信我。

  

如果我使用共享变量,我需要定义synchronized ..

如果多个线程正在访问同一个变量,则必须使用某种同步:synchronizedLockvolatileAtomic* ...这是方式这个问题太宽泛了。

  

另一个想法是如何管理线程计数变为动态的线程并依赖于用户。

不确定你的意思。当前解决方案中的线程计数 是动态的。

  

另一个问题我如何定义一些私有变量,它被分隔到每个线程而不是相互剪切.. ????

好吧,在Java中,你实际上不能拥有线程本地的变量(除了模糊ThreadLocal)因为所有东西都存在于全局堆上。但是,如果您封装了一些变量并且只允许一个线程访问它,那么您将是安全的:

public class DeviceHandler implements Runnable {
  private int noGettersAndSettersForMe;
}