我想创建动态的线程数,这取决于数据库的数据库行数。
List list = session.createQuery("From Devices").list();
线程数取决于list.size()
。
我正在使用For循环
new Thread(){public void run(){/* Task of each thread */}.start();
是否正确创建动态线程数?如果我使用共享变量,我需要定义synchronized ..任何另一个想法如何管理线程计数变为动态并依赖于用户的线程。
另一个问题我如何定义一些私有变量,它被分隔到每个线程而不是相互剪切.. ????
感谢
答案 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 ..
如果多个线程正在访问同一个变量,则必须使用某种同步:synchronized
,Lock
,volatile
,Atomic*
...这是方式这个问题太宽泛了。
另一个想法是如何管理线程计数变为动态的线程并依赖于用户。
不确定你的意思。当前解决方案中的线程计数 是动态的。
另一个问题我如何定义一些私有变量,它被分隔到每个线程而不是相互剪切.. ????
好吧,在Java中,你实际上不能拥有线程本地的变量(除了模糊ThreadLocal
)因为所有东西都存在于全局堆上。但是,如果您封装了一些变量并且只允许一个线程访问它,那么您将是安全的:
public class DeviceHandler implements Runnable {
private int noGettersAndSettersForMe;
}