2009-02-25 57 views
1

我有2个主题,其中一个轮询邮箱中的邮件,然后正在睡觉while (!quit),另一个应该更改quit标志,如果用户输入'Q'。似乎扫描线程阻塞其他线程执行,直到有一些输入(通常是2行)。我试着改变线程的优先级和它们开始的顺序,但都无济于事。如何让我的主题不会彼此阻塞?

class quitThread extends Thread { 
    public void run() { 
    char c; 
    Scanner scanner = new Scanner(System.in); 
    do { 
     c = scanner.nextLine().toUpperCase().charAt(0); 
    } while (c != 'Q'); 
    quit = true; 
    } 
} 

class recieveThread extends Thread { 
    public void run() { 
    System.out.println("thread started"); 
    while (!quit) { 
     try { 
     MailHandler handler = new MailHandler();     
     handler.recieve(); 
     System.out.println("Sleeping"); 
     sleep(_sleepinterval); 
     } catch (Exception e) { 
     e.printStackTrace(); 
     } 
    } 
    } 
} 

我知道我担心互斥和同步的,但我想在线程至少工作之前,我开始担心。 编辑: 这是我怎样,我开始线程:

void go() throws Exception{ 
    char c; 
    System.out.println("S or R"); 
    Scanner s = new Scanner(System.in); 
    c = s.nextLine().toUpperCase().charAt(0); 
    MailHandler handler = new MailHandler();     
    QuitThread q = new QuitThread(); 
    q.setPriority(java.lang.Thread.MIN_PRIORITY); 
      RecieveThread rc = new RecieveThread(); 
     rc.setPriority(java.lang.Thread.MAX_PRIORITY); 


    switch (c){ 
    case 'S': 

     handler.send("[email protected]", "hello there"); 
     break; 
    case 'R': 
     rc.start(); 
     q.start(); 
     break; 
    default : 
     break;  


    } 


} 

注:优先事项是不是原来在那里,它的东西,我只是想和它没有任何区别。

+0

代码片段中没有明显的问题。没有足够的信息来推断问题的原因。 – McDowell 2009-02-25 15:17:31

+0

你需要展示你如何开始这些线程。 – Clint 2009-02-25 15:38:44

+0

我希望“quit”被定义为volatile。你现在确实需要担心同步。这可能是你的问题的一部分。另外,在Java中,类名预计以大写字母开头。 – Eddie 2009-02-25 15:46:39

回答

0

正如你所看到的,他们不会在没有同步的情况下工作,所以先解决它。

3

两个不同类别的两个不同实例如何共享quit变量? 尝试使用两个线程共享的AtomicBoolean。

此外,您如何知道扫描线程阻塞另一个?从您的代码中,我看不到他们共享除quit变量之外的任何资源。

也许你看到“线程启动”的消息,然后你看不到的,而“沉睡”的消息,因为receiveThread卡在handler.receive()方法...