当前位置:课程学习>>第十章 多线程>>实践活动




同学们,实践是检验真理问题的唯一标准,运用你们学到的知识实践检验一下能力提升了吗?

实践主题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]

进入拓展资源