Как приоритеты Потока Java переводятся в приоритет потока ОС?

Нет! Вам не нужно каким-либо образом перезагружать tableView после завершения загрузки изображения в определенной ячейке. Кроме этого, вы все делаете правильно. Я тоже использую Kingfisher.

Но в будущем вы могли бы просто создать функцию в своем классе ячеек, скажем setupCell(_ imageURL: URL?). В любом случае, продолжая, в вашем методе cellForRow, просто сделайте это так:

cell.gifImage.kf.setImage(with: imageView, placeholder: placeHolderImage, completionHandler: nil)

Теперь, в случае, если изображение не загружено или у вас нет строки URL-адреса изображения, которую нужно сделать в URL объект, вы можете поймать его в блоке ошибок Kingfisher, тогда вам нужно будет передать ваш объект error image (a UIImage) вашему imageView, чтобы не было дублированного изображения.

Например, у меня есть следующее в функции setupCell() моей ячейки:

    if let url = vendor.image?.URLEscaped {
        let resource = ImageResource(downloadURL: url, cacheKey: url.absoluteString)
        self.imageView_Vendor.kf.setImage(with: resource, options: [.transition(.fade(0.2)), .cacheOriginalImage])
        return
    }

    self.imageView_Vendor.image = nil

Надеюсь, это поможет! 1115]

Для обработки высоты изображения это может помочь: https://stackoverflow.com/a/52787062/3231194

9
задан user2864740 6 December 2013 в 17:30
поделиться

4 ответа

Действительно, некоторые приоритетные уровни могут отобразиться на тот же "собственный" приоритетный уровень. Вот список (на основе кода Горячей точки в OpenJDK 6):

Солярис

  • 1 ⇒ 0
  • 2 ⇒ 32
  • 3 ⇒ 64
  • 4 ⇒ 96
  • 5 – 10 ⇒ 127

Знаменитый то, что на Солярисе, Вы не можете повысить приоритет потока выше нормального, только понизить его: приоритетное значение для 5 совпадает с любым из более высоких значений.

Linux

  • 1 – 10 ⇒ 4 –5 (nice значения)

Знаменитый то, что на Linux, различные приоритеты потока в Java действительно отображаются на отличные приоритетные значения на собственном уровне.

Windows

  • 1 – 2 ⇒ THREAD_PRIORITY_LOWEST
  • 3 – 4 ⇒ THREAD_PRIORITY_BELOW_NORMAL
  • 5 – 6 ⇒ THREAD_PRIORITY_NORMAL
  • 7 – 8 ⇒ THREAD_PRIORITY_ABOVE_NORMAL
  • 9 – 10 ⇒ THREAD_PRIORITY_HIGHEST
12
ответ дан 2 November 2019 в 23:11
поделиться

Так как мы говорим о потоках, я думаю, что это никогда не достигает ОС непосредственно. Приоритет является, вероятно, подсказкой к JRE о том, как запланировать процессорное время каждый поток. Для контакта с примером должен быть своего рода 'повреждающий связь' алгоритм.

В основном это будет сверх приоритета процесса ОС, если JRE не использует третью сторону, распараллеливающую стандарты как POSIX вместо того, чтобы реализовать все внутренне.

-1
ответ дан 2 November 2019 в 23:11
поделиться

Ваше понимание корректно - приоритеты потока Java не отображаются чисто на приоритеты потока ОС.

В результате, если Ваш алгоритм полагается всегда на детали приоритетного отображения потока, то это повреждается, так как это будет варьироваться согласно такому количеству переменных. Обновление Вашего JRE или применение патча/пакета обновления к Вашей ОС могли повредить его, например - и конечно просто работа другой ОС будет иметь последствия также.

Кроме очень необычных случаев, с помощью только двух приоритетов будет достаточно - Нормальный и Низкий. Большая часть работы будет сделана в Нормальном потоке. Низкий приоритет должен быть зарезервирован для потоков, которым нельзя позволить исчерпать ресурсы потоки Нормального приоритета, вместо этого просто пожирание и питание процессора, не иначе используемое.

В то время как можно стать более мелкомодульными, чем это, если Вы выбираете, необходимо знать, что любая большая деталь будет, вероятно, потеряна на целевой платформе.

1
ответ дан 2 November 2019 в 23:11
поделиться

Я не уверен в Sun JVM в Linux. Написал быструю Java-программу для создания 10 потоков с каждым приоритетом и вычисления числа пи (метод 4 * atan (1)) с помощью BigDecimals по 500 000 раз каждый, присоединения к каждому потоку и отчета о затраченном времени для метода выполнения. Да, вероятно, не лучший пример, но он будет базовым.

$uname -r && grep bogomips /proc/cpuinfo
2.4.33.3
bogomips        : 4312.26
$java -version 2>&1 |head -1
Java version "1.6.0_01"
$javac T.java && java -Xmx32m T
1:3112
2:2636
3:2662
4:3118
5:2870
6:3319
7:3412
8:3304
9:3299
10:3069

Похоже, не такое уж большое отклонение, которого можно было бы ожидать! Это было на маленькой виртуальной машине Linux. Давайте на всякий случай попробуем это на реальной плите, этот блок тоже довольно активен со средними нагрузками редко ниже 7, давайте просто посмотрим, как мы планируем в такой среде:

$uname -r && grep bogomips /proc/cpuinfo
2.6.9-67.ELsmp
bogomips        : 3992.93
bogomips        : 3990.00
$java -version 2>&1 |head -1
java version "1.4.2_14"
$javac T.java && java -Xmx32m T
1:63200
2:64388
3:62532
4:58529
5:62292
6:64872
7:64885
8:64584
9:61653
10:61575

Хммм, здесь не так много изменений, не надо ' не знаю, если 1.4 даже отображал потоки. Попробуем окно Windows. Я знаю, что в Windows довольно агрессивная схема приоритета потоков. Все, что выше нормальной анекдоты, потребляет гораздо больше. Таким образом, давайте увеличим до 900 000 итераций в каждом потоке:

C:\>java -version
java version "1.6.0_11"
C:\>java -Xmx32m T
1:12578
2:12625
3:11469
4:11453
5:10781
6:8937
7:10516
8:8406
9:9953
10:7391

Очень много того, что мы ищем, не так ли?

1
ответ дан 2 November 2019 в 23:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: