函数题:jmu-Java-07多线程-使用线程发现外星人(线程中断与线程同步协作)
某科学机构为了搜索外星人,准备使用多线程技术。当线程发现传入的关键字包含alien时则输出相关信息。
定义一个**MonitorTask**类实现Runnable接口,包含:
**属性:**
private String words,用于存放Main类通过sendWord发送过来的一个字符串。
private int count,存放找到alien关键字的次数。
**方法:**
sendWord(String words) //将入参words赋值给属性words。
run() //持续监测属性words,一旦发现属性words包含**alien**,则输出。如果线程被终止,则退出监测。**注意:** 对每个传入的words只能检查一遍,检查完后将words置为null)。线程被终止后,则推出检测。。
count属性的getter方法。
run()监测到关键字后的输出代码为: **System.out.println(Thread.currentThread().getName()+" found alien in "+words)**
**注意:**
此题涉及到线程的同步访问控制。单纯只是加锁,可能某次能得到正确答案,但不能保证每次都得到预期结果。
### 裁判测试程序:
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();
break;
} else {
if (t1.isAlive())
task1.sendWord(word);
}
}
sc.close();
t1.join();
System.out.println("Found "+task1.getCount()+" aliens!");
}
}
### 输入样例:
in
def
alien
abc
defalien
stop
### 输出样例:
out
Thread-0 found alien in alien
Thread-0 found alien in defalien
Found 2 aliens!
answer:若无答案欢迎评论
1. 线程的停止,可使用Thread对象的interrupt方法。但要注意,可能会引发异常。需正确处理。
2. 此题涉及到线程的同步协作问题。单纯全部用锁可能会得到正确的答案,但不能保证每次运行都得到正确结果。理论上要使用解决"生产者-消费者"问题的线程同步协作方式才能正确解决该问题。感兴趣的同学可以试试如下解决方案:
* synchronized、wait、notify线程同步协作机制
* Lock与Condition
* 信号量:Semaphore
* 同步队列:BlockingQueue
定义一个**MonitorTask**类实现Runnable接口,包含:
**属性:**
private String words,用于存放Main类通过sendWord发送过来的一个字符串。
private int count,存放找到alien关键字的次数。
**方法:**
sendWord(String words) //将入参words赋值给属性words。
run() //持续监测属性words,一旦发现属性words包含**alien**,则输出。如果线程被终止,则退出监测。**注意:** 对每个传入的words只能检查一遍,检查完后将words置为null)。线程被终止后,则推出检测。。
count属性的getter方法。
run()监测到关键字后的输出代码为: **System.out.println(Thread.currentThread().getName()+" found alien in "+words)**
**注意:**
此题涉及到线程的同步访问控制。单纯只是加锁,可能某次能得到正确答案,但不能保证每次都得到预期结果。
### 裁判测试程序:
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();
break;
} else {
if (t1.isAlive())
task1.sendWord(word);
}
}
sc.close();
t1.join();
System.out.println("Found "+task1.getCount()+" aliens!");
}
}
### 输入样例:
in
def
alien
abc
defalien
stop
### 输出样例:
out
Thread-0 found alien in alien
Thread-0 found alien in defalien
Found 2 aliens!
answer:若无答案欢迎评论
1. 线程的停止,可使用Thread对象的interrupt方法。但要注意,可能会引发异常。需正确处理。
2. 此题涉及到线程的同步协作问题。单纯全部用锁可能会得到正确的答案,但不能保证每次运行都得到正确结果。理论上要使用解决"生产者-消费者"问题的线程同步协作方式才能正确解决该问题。感兴趣的同学可以试试如下解决方案:
* synchronized、wait、notify线程同步协作机制
* Lock与Condition
* 信号量:Semaphore
* 同步队列:BlockingQueue