2011-01-07 3 views
1

Я использую Java и я пытаюсь ниже фрагмент кодаПроблема в запуске нить

public RunnableThread(String threadName){ 

    thread = new Thread(this,threadName); 
    System.out.println(thread.getName()); 
    thread.start(); 
    boolean status=thread.isAlive(); 
} 

но когда я м проверке состояния нити его возвращения меня ложно.

Я не понимаю, в чем проблема.

Спасибо за предложение заранее.

На самом деле мой метод run() имеет много кода для выполнения.

У моего метода main() есть кусок кода как часть его части JumboScrapeThread jumbThread = new JumbocrapeThread ("jubmThread"); Thread scraper = new Thread (jumbThread, "scraper"); scraper.start();

Как известно, когда мы вызываем thread.start(), он вызывает метод run() внутри метода. но я получаю проблему при запуске потока, поэтому мой метод run() не вызван.

Я использую нить с sellinium, так что есть ли вероятность, что я получаю проблему из-за этого ..?

+0

Что вводного() метод делать? – krakover

+1

Что вы делаете внутри thread.run(). Может быть, он заканчивается, прежде чем вы получите значение isAlive? – fmucar

+0

Теперь я получаю статус потока как живой, но, как мы знаем, start() внутренне вызывает метод run(), но в моем случае метод run не получает call.can вы предлагаете мне это? – saggy

ответ

0

Возможно, потому, что поток был запущен и закончен, прежде чем вы позвоните isAlive(). JVM не дает никаких гарантий относительно порядка, в котором выполняются потоки, если вы не входите в явную синхронизацию.

1

Наконечник заканчивается, как только метод run() заканчивается, поэтому статус потока, вероятно, будет «ложным» к моменту вызова метода isAlive(), хотя JVM не дает никаких гарантий об этом (так называемая гонка условие относительно того, возвращает ли оно true или false). Вы должны положить что-то в метод run.

+0

привет, Крис, На самом деле у моего run() есть много вещей для выполнения. Но дело в том, что nw im получает статус потока как живой, но мой метод run() не получает execute.i установил точки останова в методе run() но при отладке также не будет выполняться метод(). – saggy

1

Это потому, что для Thread нужен либо Runnable, либо Thread в качестве входных данных, и я не уверен, какой тип вашего RunnableThread и был ли вы переопределены метод run().

Если это пустое, поток завершил бы выполнение, в котором случай возвращает false.

2

Возможно классический состояние гонки: вызов start() только начинается процесс создания и в конечном итоге работает новый поток, и isAlive() вызывается до того, что процесс достиг той стадии, когда нить официально считается «начала» (или , возможно, после того, как он закончит работать).

0

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

Код

public class Main { 

    static class RunnableThread implements Runnable { 

     private Thread thread; 
     private Object waitForStart = new Object(); 

     public RunnableThread(String threadName) { 

      thread = new Thread(this, threadName); 
      System.out.println(thread.getName()); 


      synchronized (waitForStart) { 
       thread.start(); 
       try { 
        waitForStart.wait(); 
       } catch (InterruptedException ex) { 
       } 
       boolean status = thread.isAlive(); 
       System.out.println(status); 
      } 
     } 

     public void run() { 

      synchronized (waitForStart) { 
       waitForStart.notifyAll(); 
      } 

      // Do a bunch of stuff 
      try { 
       Thread.sleep(4000); 
      } catch (InterruptedException ex) { 
      } 

      System.out.println("Thread finished."); 
     } 
    } 

    public static void main(String[] args) { 
     RunnableThread thread = new RunnableThread("MyThread"); 
    } 
} 
+0

Здравствуйте, Andrew..i попробовал свой код в моей программе. Теперь мой статус потока жив, но теперь метод run еще не вызван. – saggy

+0

@ Сагги Я буду рад помочь. Не могли бы вы обновить свой вопрос с помощью кода, окружающего вас, создающего поток и первые несколько строк вашего метода запуска. У меня есть ощущение, что ваш метод запуска блокируется в синхронизации. Вы можете использовать pastebin.com и просто отвечать в комментариях, если хотите сохранить свой оригинальный вопрос чистым. –

Смежные вопросы