当前位置:课程学习>>第十章 多线程>>实践活动
同学们,实践是检验真理问题的唯一标准,运用你们学到的知识实践检验一下能力提升了吗?
实践主题1:线程的4种状态。
实践目标1:掌握线程的4种状态。
实践任务1:按模板要求,将[代码]处替换为Java程序代码
实践要求1:编写一个Java应用程序,在主线程中再创建2个线程,要求线程经历4种状态:新建、运行、中断、死亡。
ThreadExample.java
class Tortoise extends Thread {
int sleepTime=0,liveLength=0;
Tortoise(int sleepTime,String name,int liveLength) {
this.sleepTime=sleepTime;
this.liveLength=liveLength;
setName(name);
}
public void run() {
while(true) {
liveLength--;
System.out.print("@");
try {
[代码1] //让线程调用sleep方法进入中断状态,sleepIime毫秒后线程重新排队等待CPU资源
}
catch(InterruptedException e) { }
if(liveLength<=0) {
System.out.print(getName()+"进入死亡状态\n");
[代码2] //结束run方法语句
}
}
}
}
class Rabbit extends Thread {
int sleepTime=0,liveLength;
Rabbit(int sleepTime,String name,int liveLength) {
this.sleepTime=sleepTime;
this.liveLength=liveLength;
setName(name);
}
public void run() {
while(true) {
liveLength--;
System.out.print("*");
try {
[代码3] //让线程调用sleep方法进入中断状态,sleepIime毫秒后线程重新排队等待CPU资源
}
catch(InterruptedException e) { }
if(liveLength<=0) {
System.out.print(getName()+"进入死亡状态\n");
[代码4] //结束run方法语句
}
}
}
}
public class ThreadExample {
public static void main(String[] args) {
Rabbit rabbit;
rabbit=[代码5] //新建线程rabbit
Tortoise tortoise;
tortoise=[代码6] //新建线程tortoise
[代码7] //启动线程tortoise
[代码8] //启动线程rabbit
}
}
这个实践主要是加强对线程4种状态的掌握。参考代码如下:
sleep(sleepTime); //[代码1]
break; //[代码2]
sleep(sleepTime); //[代码3]
break; //[代码4]
rabbit=new Rabbit(200,"兔子",50); //[代码5]
tortoise=new Tortoise(300,"乌龟",50); //[代码6]
tortoise.start(); //[代码7]
rabbit.start(); //[代码8]
实践主题2:线程之间共享数据。
实践目标2:学习用Thread类创建线程,掌握哪些数据是线程之间共享的,哪些数据是线程独有的。
实践任务2:按模板要求,将[代码]处替换为Java程序代码。
实践任务2:编写一个Java应用程序,在主线程中用Thread类再创建2个线程,2个线程共享一个int型的数据,并各自有自己独占的数据。
BankExample.java
class Bank implements Runnable {
[代码1] //声明一个int型变量money,初值为100
Thread zhang,keven;
Bank() {
[代码2] //创建zhang,Bank对象为zhang的目标对象
zhang.setName("会计");
[代码3] //创建keven,Bank对象为keven的目标对象
keven.setName("出纳");
}
public void run() {
[代码4] //声明一个int型变量i,初值为0
while(true) {
if( [代码5] ) { //判断线程zhang是否正在占有CPU资源
i=i+1;
money=money+1;
System.out.println(zhang.getName()+"将money的值改为"+money);
System.out.print(zhang.getName()+"的局部变量i="+i);
if( i>=6) {
System.out.println(zhang.getName()+"线程进入死亡状态");
[代码6] //使得线程zhang进入死亡状态
}
try {
Thread.sleep(1000);
}
catch(InterruptedException e) { }
}
else if( [代码7] ) { //判断线程keven是否正在占有CPU资源
i=i-1;
money=money-1;
System.out.println(keven.getName()+"将money的值改为"+money);
System.out.print(keven.getName()+"的局部变量i="+i);
if( i<=-6) {
System.out.println(keven.getName()+"线程进入死亡状态");
[代码8] //使得线程keven进入死亡状态
}
try {
Thread.sleep(1000);
}
catch(InterruptedException e) { }
}
}
}
}
class BankExample {
public static void main(String[] args) {
Bank bank=new Bank();
bank.zhang.start();
bank.keven.start();
}
}
这个实践主要是加强对线程创建、线程间数据共享的掌握。参考代码如下:
int money=100; //[代码1]
zhang=new Thread(this); //[代码2]
keven=new Thread(this); //[代码3]
int i=0; //[代码4]
if( zhang.isAlive() ) { //[代码5]
zhang.stop(); //[代码6]
else if( keven.isAlive() ) { //[代码7]
keven.stop(); //[代码8]
实践主题3:挂起、恢复和终止线程。
实践目标3:学习使用wait方法挂起线程的执行,使用notifyAll方法恢复线程的执行。
实践任务3:按模板要求,将[代码]处替换为Java程序代码。
实践要求3:通过单击“开始”按钮启动线程,该线程负责移动一个红色的标签。通过单击“挂起”按钮暂时中断线程的执行,单击“恢复”按钮恢复线程,通过单击“终止”按钮终止线程。
StartOrStop.java
import java.awt.*;
import java.awt.event.*;
class Win extends Frame implements Runnable,ActionListener {
Thread moveOrStop;
Button start,hang,resume,die;
Label moveLabel;
boolean move=false,dead=false;
Win() {
[代码1] //创建线程moveOrStop,当前窗口为moveOrStop的目标对象
start=new Button("线程开始");
hang=new Button("线程挂起");
resume=new Button("线程恢复");
die=new Button("线程终止");
start.addActionListener(this);
hang.addActionListener(this);
resume.addActionListener(this);
die.addActionListener(this);
moveLabel=new Label("线程负责运动我");
moveLabel.setBackground(Color.red);
setLayout(new FlowLayout());
add(start);
add(hang);
add(resume);
add(die);
add(moveLabel);
setSize(500,500);
validate();
setVisible(true);
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
}
);
}
public void actionPerformed(ActionEvent e) {
if( e.getSource()==start) {
try {
move=true;
[代码2] //启动线程moveOrStop
}
catch(Exception event) { }
}
else if(e.getSource()==hang)
move=false;
else if (e.getSource()==resume) {
move=true;
[代码3] //调用resumeThread()方法恢复线程
}
else if(e.getSource()==die)
dead=true;
}
public void run() {
while(true) {
while(!move) {
try {
[代码4] //调用hangThread()方法挂起线程
}
catch(InterruptedException e1) { }
}
int x=moveLabel.getBounds().x;
int y=moveLabel.getBounds().y;
y=y+2;
if(y>=200) y=10;
moveLabel.setLocation(x,y);
try {
moveOrStop.sleep(200);
}
catch(InterruptedException e2) { }
if(dead==true)
[代码5] //结束run()方法终止线程
}
}
public synchronized void hangThread() throws InterruptedException {
[代码6] //调用wait()方法
}
public synchronized void resumeThread() {
[代码7] //调用notifyAll()方法
}
}
public class StartOrStop {
public static void main(String[] args) {
Win win=new Win();
}
}
这个实践主要是加强线程wait()、notify()方法的掌握。参考代码如下:
moveOrStop=new Thread(this); //[代码1]
moveOrStop.start(); //[代码2]
resumeThread(); //[代码3]
hangThread(); // [代码4]
moveOrStop.stop(); //[代码5]
wait(); //[代码6]
notifyAll(); //[代码7]