我有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;
}
}
注意:优先级原本并不存在,这是我刚刚尝试的东西,并没有任何区别。
答案 0 :(得分:3)
两个不同类的两个不同实例如何共享quit
变量?
尝试使用在两个线程之间共享的AtomicBoolean。
另外,你怎么知道扫描线程阻塞另一个?从您的代码中,除了quit
变量外,我看不到它们共享任何资源。
也许您看到“线程已启动”消息,然后您暂时看不到“休眠”消息,因为receiveThread卡在handler.receive()方法中...
答案 1 :(得分:0)
正如您所看到的,如果没有同步,它们将无法工作,因此请先修复它。
答案 2 :(得分:0)
看起来与bug 4206767
相关