Существует ли способ неограниченно долго приостановить поток?

Я бы сказал, что ваше предположение, что специальные символы будут заменены дважды, неверно. Функция замены работает только в том случае, если вы пытаетесь заменить вхождение String, которое, похоже, не работает со специальными символами. Только заменить все, кажется, работает в этом случае. В вашем коде вы пытаетесь заменить специальные символы вместе с другими строками внутри этого, так что только функция replaceAll сделает это.

Другими словами, когда выполняется функция replaceAll, она проверяет наличие специальных символов и заменяет ее один раз. Вам не потребуется усилий при использовании StringTokenizer, который является частью библиотеки Scanner, он требуется только в том случае, если вы принимаете ввод пользователя. Таким образом, независимо от того, что вы делаете, вы увидите только 1 friends вместо 11 friends, вам также не понадобится оператор if. Кредит переходит к jbx выше для регулярных выражений. Теперь вы можете сократить свой код следующим образом, помня, что напечатано 1, заменяя whatever внутри специального символа, заменяемого одним числом 1.

Вам понадобится if-statement для поиска, замены или замены функции, которая уже ищет в String, который вы указали для поиска, так что если оператор if является избыточным, то это просто приводит к тому, что код становится многословным. [ 1115]

package object_list_stackoverflow;
import java.util.StringTokenizer;
public class Object_list_stackoverflow {
    public static void main(String[] args) {
        String word1 = "hello! hello!! %can you hear me%? Yes I can.";
        String word2 ="*Java is awesome* Do you % agree % with us?";
        String word3 ="%*hello*% friends";
        String regex = "\\*[^\\*]+\\*";
        String regex1= "\\%[^\\%]+\\%";       
  System.out.println(word3.replaceAll(regex, "1").replaceAll(regex1, "1")); 
       }   
    }

Также прочитайте аналогичный вопрос, перейдя по ссылке: Найти текст между специальными символами и заменить строку
Вы также можете избавиться от буквенно-цифровых символов, посмотрев на ответ dhuma1981: [1111 ] Как заменить специальные символы в строке?

Синтаксис для замены буквенно-цифровых символов в строке:

replaceAll("[^a-zA-Z0-9]", "");

33
задан Dan Herbert 27 September 2008 в 02:54
поделиться

4 ответа

Никогда не используйте Thread.Suspend. Основная проблема с ним состоит в том, что 99% времени, Вы не можете знать то, что тот поток делает при приостановке его. Если тот поток содержит блокировку, Вы помогаете войти в ситуацию с мертвой блокировкой, и т.д. Иметь в виду, что кодируют Вас, звонят, может получать/выпускать блокировки негласно. Win32 имеет подобный API: SuspendThread и ResumeThread. Следующие документы для SuspendThread дают хорошую сводку опасностей API:

http://msdn.microsoft.com/en-us/library/ms686345 (По сравнению с 85) .aspx

Эта функция, прежде всего, разработана для использования отладчиками. Это не предназначается, чтобы использоваться для синхронизации потока. Называние SuspendThread на потоке, который владеет объектом синхронизации, таким как взаимное исключение или критический раздел, может привести к мертвой блокировке, если вызывающий поток пытается получить объект синхронизации, принадлежавший приостановленному потоку. Для предотвращения этой ситуации поток в рамках приложения, которое не является отладчиком, должен сигнализировать, чтобы другой поток приостановил себя. Целевой поток должен быть разработан, чтобы наблюдать за этим сигналом и ответить соответственно.

надлежащий способ приостановить поток неограниченно долго состоит в том, чтобы использовать ManualResetEvent. Поток является наиболее вероятным цикличным выполнением, выполняя некоторую работу. Самый легкий способ приостановить поток состоит в том, чтобы иметь "проверку" потока событие каждое повторение, как так:

while (true)
{
    _suspendEvent.WaitOne(Timeout.Infinite);

    // Do some work...
}

Вы определяете бесконечный тайм-аут поэтому, когда событие не будет сообщено, поток заблокируется неограниченно долго, пока событие не сообщено, в которой точке поток возобновит, где это кончило.

Вы создали бы событие как так:

ManualResetEvent _suspendEvent = new ManualResetEvent(true);

true параметр говорит событию начинаться в сообщенном состоянии.

, Когда Вы хотите приостановить поток, Вы делаете следующее:

_suspendEvent.Reset();

И возобновлять поток:

_suspendEvent.Set();

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

Только для забавы я обеспечу полный пример:

public class Worker
{
    ManualResetEvent _shutdownEvent = new ManualResetEvent(false);
    ManualResetEvent _pauseEvent = new ManualResetEvent(true);
    Thread _thread;

    public Worker() { }

    public void Start()
    {
        _thread = new Thread(DoWork);
        _thread.Start();
    }

    public void Pause()
    {
        _pauseEvent.Reset();
    }

    public void Resume()
    {
        _pauseEvent.Set();
    }

    public void Stop()
    {
        // Signal the shutdown event
        _shutdownEvent.Set();

        // Make sure to resume any paused threads
        _pauseEvent.Set();

        // Wait for the thread to exit
        _thread.Join();
    }

    public void DoWork()
    {
        while (true)
        {
            _pauseEvent.WaitOne(Timeout.Infinite);

            if (_shutdownEvent.WaitOne(0))
                break;

            // Do the work here..
        }
    }
}
93
ответ дан 27 November 2019 в 17:31
поделиться

Поточная обработка в электронной книге C# суммирует Поток. Приостановите и Поток. Возобновитесь таким образом:

устаревшие Приостанавливают, и методы Резюме имеют два режима †“, опасные и бесполезные!

книга рекомендует использовать конструкцию синхронизации такой в качестве AutoResetEvent или Монитор. Ожидайте для выполнения приостановки потока и возобновления.

16
ответ дан 27 November 2019 в 17:31
поделиться

Около предложений выше, я хотел бы добавить одну подсказку. В некоторых случаях используйте BackgroundWorker, может упростить Ваш код (особенно, когда Вы используете анонимный метод для определения DoWork и других событий его).

0
ответ дан 27 November 2019 в 17:31
поделиться

В соответствии с тем, что другие сказали - не делают этого. То, что Вы действительно хотите сделать, должно "приостановить работу" и позволить Вашим потокам переместиться свободные. Можно ли предоставить нам еще некоторую подробную информацию о потоке (потоках), который Вы хотите приостановить? Если бы Вы не запустили поток, то Вы определенно не должны даже рассматривать приостановку его - не Ваш. Если это - Ваш поток, то я предлагаю вместо того, чтобы приостановить его, у Вас просто есть он, находятся, ожидая большего количества работы, чтобы сделать. Brannon имеет некоторые превосходные предложения для этой опции в его ответе. С другой стороны, просто позвольте ему закончиться; и вращайте новый при необходимости в нем.

0
ответ дан 27 November 2019 в 17:31
поделиться
Другие вопросы по тегам:

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