函数题:jmu-Java-07多线程-Runnable与停止线程
某科学机构为了搜索外星人,准备使用多线程技术。当线程发现传入的关键字包含alien时则输出相关信息。
定义一个**MonitorTask**类实现Runnable接口,包含:
**属性:**
private String words用于存放Main类通过sendWord发送过来的一串字符串。
**方法:**
sendWord(String words) //将入参word赋值给属性word。
run() //持续监测属性word,一旦发现属性word包含alien,则输出。一旦发现线程被终止,则退出监测。
和一些其他私有方法。
run()监测到关键字后的输出代码为: **System.out.println(Thread.currentThread().getName()+" found alien in "+word)**
**注:** 对每个传入的word只检查一遍(检查完后将word置为null)。当线程被终止,跳出无限循环后,使用 **System.out.println(Thread.currentThread().getName() + " stop")** 打印标识信息。
**注意:**
此题涉及到线程的同步访问控制。单纯只是加锁,可能某次能得到正确答案,但不能保证每次都得到预期结果。
### 裁判测试程序:
java
import java.util.Scanner;
/*这里放置你的代码*/
public class Main {
public static void main(String[] args) throws InterruptedException {
MonitorTask task1 = new MonitorTask();
Thread t1 = new Thread(task1);
t1.start();
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
String word = sc.next();
if (word.equals("stop")) {
t1.interrupt();
} else if (word.equals("quit")) {
break;
} else {
if (t1.isAlive())
task1.sendWord(word);
}
}
sc.close();
System.out.println(t1.isAlive());
System.out.println(Thread.currentThread().getName()+" end!");
t1.interrupt(); // main线程退出时通知t1结束
}
}
### 输入样例:
in
def
alien
abc
defalien
stop
quit
### 输出样例:
out
Thread-0 found alien in alien
Thread-0 found alien in defalien
Thread-0 stop
main end!
false
答案:若无答案欢迎评论
此题涉及到同步问题。单纯全部用锁可能会得到正确的答案,但不能保证每次运行都得到正确结果。
理论上要使用"生产者-消费者"模型、信号量、同步队列等才能正确解决该问题。
感兴趣的同学可以试试如下解决方案:
* Lock与Condition
* 信号量:Semaphore
* 同步队列:BlockingQueue
定义一个**MonitorTask**类实现Runnable接口,包含:
**属性:**
private String words用于存放Main类通过sendWord发送过来的一串字符串。
**方法:**
sendWord(String words) //将入参word赋值给属性word。
run() //持续监测属性word,一旦发现属性word包含alien,则输出。一旦发现线程被终止,则退出监测。
和一些其他私有方法。
run()监测到关键字后的输出代码为: **System.out.println(Thread.currentThread().getName()+" found alien in "+word)**
**注:** 对每个传入的word只检查一遍(检查完后将word置为null)。当线程被终止,跳出无限循环后,使用 **System.out.println(Thread.currentThread().getName() + " stop")** 打印标识信息。
**注意:**
此题涉及到线程的同步访问控制。单纯只是加锁,可能某次能得到正确答案,但不能保证每次都得到预期结果。
### 裁判测试程序:
java
import java.util.Scanner;
/*这里放置你的代码*/
public class Main {
public static void main(String[] args) throws InterruptedException {
MonitorTask task1 = new MonitorTask();
Thread t1 = new Thread(task1);
t1.start();
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
String word = sc.next();
if (word.equals("stop")) {
t1.interrupt();
} else if (word.equals("quit")) {
break;
} else {
if (t1.isAlive())
task1.sendWord(word);
}
}
sc.close();
System.out.println(t1.isAlive());
System.out.println(Thread.currentThread().getName()+" end!");
t1.interrupt(); // main线程退出时通知t1结束
}
}
### 输入样例:
in
def
alien
abc
defalien
stop
quit
### 输出样例:
out
Thread-0 found alien in alien
Thread-0 found alien in defalien
Thread-0 stop
main end!
false
答案:若无答案欢迎评论
此题涉及到同步问题。单纯全部用锁可能会得到正确的答案,但不能保证每次运行都得到正确结果。
理论上要使用"生产者-消费者"模型、信号量、同步队列等才能正确解决该问题。
感兴趣的同学可以试试如下解决方案:
* Lock与Condition
* 信号量:Semaphore
* 同步队列:BlockingQueue