Отладка-Thread.State: WAITING? Что это значит? [Дубликат]

$result = mysql_query('SELECT * FROM Users WHERE UserName LIKE $username');

Вы определяете строку, используя одинарные кавычки, и PHP не анализирует строки с разделителями одиночной кавычки. Чтобы получить переменную интерполяцию, вам нужно использовать двойные кавычки или конкатенацию строк (или их комбинацию). См. http://php.net/manual/en/language.types.string.php для получения дополнительной информации.

Также вы должны проверить, что mysql_query вернул действительный ресурс результата, иначе fetch_ *, num_rows и т. д. не будут работать с результатом, поскольку это не результат! IE:

$username = $_POST['username'];
$password = $_POST['password'];
$result = mysql_query('SELECT * FROM Users WHERE UserName LIKE $username');

if( $result === FALSE ) {
   trigger_error('Query failed returning error: '. mysql_error(),E_USER_ERROR);
} else {
   while( $row = mysql_fetch_array($result) ) {
      echo $row['username'];
   }
}

http://us.php.net/manual/en/function.mysql-query.php для получения дополнительной информации.

59
задан fiddler 27 October 2015 в 09:19
поделиться

6 ответов

Поток переходит в состояние ожидания, когда он вызывает wait() объекта. Это называется Ожидающее состояние. Когда поток достигнет состояния ожидания, ему придется подождать до некоторого другого потока notify() или notifyAll() на объекте.

После того, как этот поток будет уведомлен, он не будет запущен. Возможно, другие потоки также уведомлены (используя notifyAll()), или первый поток не завершил свою работу, поэтому он по-прежнему блокируется, пока не получит свой шанс. Это называется заблокированным состоянием.

После того, как останутся другие потоки и вероятность этого потока, он переходит в состояние Runnable после того, как он имеет право на получение работы на основе механизма потоковой передачи JVM и переходит в состояние запуска.

45
ответ дан Ankit Bansal 26 August 2018 в 00:20
поделиться

см. этот пример:

демонстрация состояний потока.

/*NEW- thread object created, but not started.
RUNNABLE- thread is executing.
BLOCKED- waiting for monitor after calling wait() method.
WAITING- when wait() if called & waiting for notify() to be called.
  Also when join() is called.
TIMED_WAITING- when below methods are called:
 Thread.sleep
 Object.wait with timeout
 Thread.join with timeout
TERMINATED- thread returned from run() method.*/
public class ThreadBlockingState{

public static void main(String[] args) throws InterruptedException {
    Object obj= new Object();
    Object obj2 = new Object();
    Thread3 t3 = new Thread3(obj,obj2);
    Thread.sleep(1000);
    System.out.println("nm:"+t3.getName()+",state:"+t3.getState().toString()+
            ",when Wait() is called & waiting for notify() to be called.");
    Thread4 t4 = new Thread4(obj,obj2);
    Thread.sleep(3000);
    System.out.println("nm:"+t3.getName()+",state:"+t3.getState().toString()+",After calling Wait() & waiting for monitor of obj2.");
    System.out.println("nm:"+t4.getName()+",state:"+t4.getState().toString()+",when sleep() is called.");
}

}
class Thread3 extends Thread{
Object obj,obj2;
int cnt;
Thread3(Object obj,Object obj2){
    this.obj = obj;
    this.obj2 = obj2;
    this.start();
}

@Override
public void run() {
    super.run();
    synchronized (obj) {
        try {
            System.out.println("nm:"+this.getName()+",state:"+this.getState().toString()+",Before Wait().");
            obj.wait();             
            System.out.println("nm:"+this.getName()+",state:"+this.getState().toString()+",After Wait().");
            synchronized (obj2) {
                cnt++;
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
}
class Thread4 extends Thread{
Object obj,obj2;
Thread4(Object obj,Object obj2){
    this.obj = obj;
    this.obj2 = obj2;
    this.start();
}

@Override
public void run() {
    super.run();
    synchronized (obj) {
        System.out.println("nm:"+this.getName()+",state:"+this.getState().toString()+",Before notify().");
        obj.notify();
        System.out.println("nm:"+this.getName()+",state:"+this.getState().toString()+",After notify().");
    }
    synchronized (obj2) {
        try {
            Thread.sleep(15000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
}
0
ответ дан murali 26 August 2018 в 00:20
поделиться

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

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

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

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

2
ответ дан Nathan Hughes 26 August 2018 в 00:20
поделиться

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

1
ответ дан Prakash Bisht 26 August 2018 в 00:20
поделиться

Отличие относительно просто.

В состоянии BLOCKED поток вот-вот войдет в блок synchronized, но есть еще один поток, текущий в рамках блока synchronized на тот же объект. Первый поток должен ждать, пока второй поток выйдет из своего блока.

В состоянии WAITING поток ожидает сигнала из другого потока. Обычно это происходит путем вызова Object.wait() или Thread.join(). Затем поток будет оставаться в этом состоянии, пока другой поток не вызовет Object.notify() или не умрет.

60
ответ дан Roland 26 August 2018 в 00:20
поделиться

Упрощенная перспектива для интерпретации дампов потоков:

  • WAIT - Я жду, чтобы мне дали какую-то работу, поэтому я сейчас простаиваю.
  • BLOCKED - I «Я занят, пытаясь выполнить работу, но на моем пути стоит еще один поток, поэтому я сейчас простаиваю.
  • RUNNABLE ... (Native Method) - я вызвал для RUN некоторый собственный код ( который еще не завершен), так как JVM обеспокоен, вы RUNNABLE, и он не может дать никакой дополнительной информации. Общим примером может быть собственный метод прослушивания сокетов, закодированный в C, который на самом деле ждет, пока какой-либо трафик не поступит, поэтому я сейчас простаиваю. В этой ситуации это можно рассматривать как особый вид WAIT, поскольку мы на самом деле не работаем (без процессора), но вам придется использовать дамп потока операционной системы, а не дамп потока Java, чтобы увидеть его.
5
ответ дан Sridhar-Sarnobat 26 August 2018 в 00:20
поделиться
Другие вопросы по тегам:

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