Как насчет ковариантные типы возврата , которые существовали начиная с JDK 1.5? Это довольно плохо разглашено, поскольку это - несексуальное дополнение, но насколько я понимаю, абсолютно необходимо для дженериков работать.
По существу, компилятор теперь позволяет подклассу сужать тип возврата переопределенного метода быть подклассом типа возврата исходного метода. Таким образом, это позволяется:
class Souper {
Collection<String> values() {
...
}
}
class ThreadSafeSortedSub extends Souper {
@Override
ConcurrentSkipListSet<String> values() {
...
}
}
можно назвать подкласс values
метод и получить отсортированное ориентированное на многопотоковое исполнение Set
из String
s , не имея необходимость вниз бросать к ConcurrentSkipListSet
.
Да, это так.
BackgroundWorker.RunWorkerAsync
просто вызывает BeginInvoke
внутреннего делегата, который, в свою очередь, помещает запрос в ThreadPool
. Так как все потоки ThreadPool
являются фоновыми , да, они закончатся, когда приложение завершится.
Однако имейте в виду, что:
«закрывая приложение WinForms» я Я предполагаю, что закрываю экземпляр main Form
(обычно он передается в Application.Run
в классе Program
, созданном автоматически Visual Studio) . Если у вас есть дочернее окно с фоновым рабочим, оно не остановит свой BackgroundWorker
автоматически.
Разрешение прерывания фонового потока при выходе из приложения является не рекомендуемым способом завершения потока, поскольку у вас нет гарантий, где он будет прерван. Гораздо лучше было бы сигнализировать работнику перед закрытием, дождаться его корректного завершения и затем выйти.
Дополнительная информация: Delegate.BeginInvoke , MSDN on Thread Pooling , Thread.IsBackground
Единственный способ, которым поток может продолжить выполнение после остановки вашего основного (UI) потока, - это если он был создан явно, путем создания нового экземпляра потока и установки для IsBackground значения false. Если вы этого не сделаете (или если вы используете ThreadPool, который порождает фоновые потоки, или BackgroundWorker, который также использует ThreadPool внутри), ваш поток будет фоновым потоком и будет завершен, когда основной поток завершится.
Потоки BackgroundWorker - это фоновые потоки ( ThreadPool потоки), , которые умирают, когда приложение умирает .
Да, будет. Я написал эту простую форму, и закрытие формы приводит к выходу из приложения:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
this.backgroundWorker1.RunWorkerAsync();
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
while (true)
{
Thread.Sleep(100);
}
}
}
Вы не можете изменить часовой пояс GWT, следовательно, все java.util.Date имеют часовой пояс браузера. Вам нужно будет обработать текущую настройку часового пояса вручную.
Я вижу 3 варианта:
Вы сами управляете преобразованием часового пояса.
Вы переопределяете сериализатор / десериализатор java.util.Date как в этом сообщении . И, возможно, с использованием специальной реализации java.util.Date , которая переопределяет getTimezoneOffset () . Этот подход требует перекомпиляции GWT API!.
Вы реализуете свою собственную дату, либо расширяя java.util.Date (как в варианте 2), либо оборачивая его некоторым объектом часового пояса. В этом варианте CustomFieldSerializer все еще может быть полезен,
После завершения процесса все связанные потоки также исчезают.
Прежде всего, просто для упрощения этого ответа:
Когда процесс закрывается, все его потоки завершаются. Здесь нет никаких сомнений.
Вопрос, как я его понимаю, становится таким:
Будут ли все еще работающие экземпляры
BackgroundWorker
препятствовать закрытию приложения?
Ответ на этот вопрос: нет, не будут.
Думаю, да. Поскольку потоки связаны с процессом, и если процесс закрыт, все потоки должны завершиться.