Сон действительно блокирует выполнение?

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

При использовании оператора == для сравнения строк вы не сравниваете содержимое строки , но фактически сравнивают адрес памяти. Если они равны, в противном случае они вернут true и false. Если значение равно в строке, сравнивает содержимое строки.

Итак, вопрос в том, что все строки кэшируются в системе, как получается == возвращает false, тогда как equals возвращает true? Ну, это возможно. Если вы создадите новую строку, например String str = new String("Testing"), вы создадите новую строку в кеше, даже если в кеше уже содержится строка с тем же содержимым. Короче говоря, "MyString" == new String("MyString") всегда будет возвращать false.

Java также говорит о функции intern (), которая может использоваться в строке, чтобы сделать ее частью кеша, поэтому "MyString" == new String("MyString").intern() вернет true.

Примечание: == оператор намного быстрее, чем равен только потому, что вы сравниваете два адреса памяти, но вы должны быть уверены, что код не создает новые экземпляры String в коде. В противном случае вы столкнетесь с ошибками.

0
задан Crouching Kitten 10 March 2019 в 00:59
поделиться

1 ответ

В C # 7.3 у вас могут быть асинхронные точки входа, я предлагаю использовать это.

Некоторые примечания:

  1. Не используйте асинхронную пустоту, у нее есть тонкости в том, как она работает с ошибками, если вы видите, что вы пишете сам асинхронную пустоту, тогда подумайте, кто вы делает. Если это не для обработчика событий, вы, вероятно, делаете что-то не так
  2. Если вы хотите дождаться завершения ряда задач, используйте Task.WhenAll

Модифицированный пример

static async Task Main(string[] args)
{
   Console.WriteLine("Start Task");
   var task = Program.step1();

   for (int i = 0; i < 6; i++)
   {
      await Task.Delay(100);
      Console.WriteLine("Sleep-Loop");
   }

   Console.WriteLine("waiting for the task to finish");
   await task;
   Console.WriteLine("finished");
   Console.ReadKey();
}

private static async Task step1()
{
   await Task.Delay(1000);
   Console.WriteLine("Step1");
   await Program.step2();
}

private static async Task step2()
{
   await Task.Delay(1000);
   Console.WriteLine("Step2");
}

Важно отметить, что задачи не являются потоками и async не параллельны, однако они могут быть.

9 раз из 10, если вы используете шаблон асинхронного ожидания, работа, связанная с вводом-выводом, должна использовать порты завершения ввода-вывода операционной системы, чтобы вы могли освободить потоки. Это функция масштабируемости и отзывчивости пользовательского интерфейса.

Если вы не выполняете какую-либо работу ввода-вывода, тогда на самом деле совсем нет нужды в паттерне async await, и, как следствие, такая работа процессора, вероятно, должна быть просто заключена в Task.Run в точке вызова. Не упакован в методе async.

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

И последнее; если вы считаете, что вам нужно использовать асинхронный код с огнем и забыть, очень тщательно подумайте, как вы будете обрабатывать любые ошибки.

Вот несколько рекомендаций.

  • Если вы хотите выполнить работу ввода-вывода, используйте шаблон асинхронного ожидания.
  • Если вы хотите выполнить работу процессора, используйте Task.Run.
  • Никогда не используйте async void, кроме как для обработчика событий.
  • Никогда не переносите работу ЦП в асинхронном методе, пусть вызывающая сторона использует Task.Run
  • Если вам нужно дождаться выполнения задачи, await ее, никогда не вызывайте Result или [ 1110] или используйте Task.WhenAll
0
ответ дан TheGeneral 10 March 2019 в 00:59
поделиться
Другие вопросы по тегам:

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