Tag: 线程本地

如何强制Java线程关闭线程本地数据库连接

使用线程本地数据库连接时,线程存在时需要关闭连接。 这只能我可以覆盖调用线程的run()方法。 即使这不是一个很好的解决方案,因为在退出时,我不知道该线程是否曾打开过连接。 问题实际上更为通用:如何强制线程在退出时调用线程局部对象的某些终结方法。 我查看了java 1.5的源代码,发现线程局部映射设置为null,这最终会导致垃圾收集调用finalize() ,但我不想指望垃圾收集器。 以下覆盖似乎是不可避免的,以确保关闭数据库连接: @Override public void remove() { get().release(); super.remove(); } 其中, release()关闭数据库连接(如果已打开)。 但我们不知道该线程是否曾使用过该线程本地。 如果此线程从未调用过get(),那么这里的工作就相当浪费:将调用ThreadLocal.initialValue() ,在此线程上创建一个map等。 – 根据Thorbjørn的评论进一步澄清和举例: java.lang.ThreadLocal是绑定到线程的对象的工厂类型。 此类型具有对象的getter和工厂方法(通常由用户编写)。 当调用getter时,它只调用此方法之前从未调用过的方法。 使用ThreadLocal允许开发人员将资源绑定到线程,即使线程代码是由第三方编写的。 示例:假设我们有一个名为MyType的资源类型,我们希望每个线程只有一个。 在using类中定义:private static ThreadLocal resourceFactory = new ThreadLocal(){@ override protected MyType initialValue(){return new MyType(); }} 在此类的本地上下文中使用:public void someMethod(){MyType resource = resourceFactory.get(); resource.useResource(); } get()只能在调用线程的生命周期中调用initialValue()一次。 此时, MyType的实例将被实例化并绑定到此线程。 此线程对get()的后续调用再次引用此对象。 经典的用法示例是MyType是一些线程不安全的text […]

Java Cached线程池和线程本地

我有一个关于java和并发的问题。 假设我有一个名为a的ThreadLocal变量。 我使用CachedThreadPool来获取新线程。 当一个线程被重新调用时,ThreadLocal变量会发生什么? 它保持相同的值(因为它是一个相同的线程)或它开始为空(好像线程是新的)? 谢谢

如何确保我不是同时在两个线程之间共享相同的套接字?

我有一个代码,我正在处理套接字,我需要确保我不在两个线程之间共享相同的套接字 。 在我的下面的代码中,我有一个后台线程,每60秒运行一次并调用updateLiveSockets()方法。 在updateLiveSockets()方法中,我迭代我拥有的所有套接字,然后通过调用SendToQueue类的send方法SendToQueue ping它们,并根据响应我将它们标记为活动或死亡。 现在所有的读者线程将同时调用getNextSocket()方法来获取下一个可用的套接字,因此它必须是线程安全的,我需要确保所有的读者线程都应该看到相同的SocketHolder和Socket状态。 下面是我的SocketManager类: public class SocketManager { private static final Random random = new Random(); private final ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor(); private final Map<Datacenters, List> liveSocketsByDatacenter = new ConcurrentHashMap(); private final ZContext ctx = new ZContext(); // … private SocketManager() { connectToZMQSockets(); scheduler.scheduleAtFixedRate(this::updateLiveSockets, 60, 60, TimeUnit.SECONDS); } // during startup, making […]