如何使我的线程不会相互阻塞?

时间:2009-02-25 13:30:36

标签: java multithreading synchronization

我有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("blah@blah.net", "hello there");
        break;
    case 'R':
        rc.start();
        q.start();
        break;
    default :
        break;      


    }


}

注意:优先级原本并不存在,这是我刚刚尝试的东西,并没有任何区别。

3 个答案:

答案 0 :(得分:3)

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

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

也许您看到“线程已启动”消息,然后您暂时看不到“休眠”消息,因为receiveThread卡在handler.receive()方法中...

答案 1 :(得分:0)

正如您所看到的,如果没有同步,它们将无法工作,因此请先修复它。

答案 2 :(得分:0)

看起来与bug 4206767

相关