| 148 | } |
| 149 | |
| 150 | @Override |
| 151 | public void run() { |
| 152 | while (true) { |
| 153 | try { |
| 154 | Reference<? extends Object> ref = referenceQueue.remove(CLEANER_LINGER_TIME); |
| 155 | if (ref instanceof CleanerRef) { |
| 156 | ((CleanerRef) ref).clean(); |
| 157 | } else if (ref == null) { |
| 158 | synchronized (referenceQueue) { |
| 159 | Logger logger = Logger.getLogger(Cleaner.class.getName()); |
| 160 | if (firstCleanable == null) { |
| 161 | cleanerThread = null; |
| 162 | logger.log(Level.FINE, "Shutting down CleanerThread"); |
| 163 | break; |
| 164 | } else if (logger.isLoggable(Level.FINER)) { |
| 165 | StringBuilder registeredCleaners = new StringBuilder(); |
| 166 | for(CleanerRef cleanerRef = firstCleanable; cleanerRef != null; cleanerRef = cleanerRef.next) { |
| 167 | if(registeredCleaners.length() != 0) { |
| 168 | registeredCleaners.append(", "); |
| 169 | } |
| 170 | registeredCleaners.append(cleanerRef.cleanupTask.toString()); |
| 171 | } |
| 172 | logger.log(Level.FINER, "Registered Cleaners: {0}", registeredCleaners.toString()); |
| 173 | } |
| 174 | } |
| 175 | } |
| 176 | } catch (InterruptedException ex) { |
| 177 | // Can be raised on shutdown. If anyone else messes with |
| 178 | // our reference queue, well, there is no way to separate |
| 179 | // the two cases. |
| 180 | // https://groups.google.com/g/jna-users/c/j0fw96PlOpM/m/vbwNIb2pBQAJ |
| 181 | break; |
| 182 | } catch (Exception ex) { |
| 183 | Logger.getLogger(Cleaner.class.getName()).log(Level.SEVERE, null, ex); |
| 184 | } |
| 185 | } |
| 186 | } |
| 187 | } |
| 188 | } |