实验报告
课程名称: Java 2
实验项目: 多线程实验
指导教师: ****
实验位置: 电信楼机房
姓 名: ***
学 号: ****
班 级: ****
日 期:
一、实验目的
1、掌握多线程编程的特点和工作原理;
2、掌握编写线程程序的方法
3、了解线程的调度和执行过程
4、掌握线程同步机理
二、实验环境
windows记事本,java jdk 1.60版本,cmd命令运行窗口
三、实验内容
实验一:
应用Java中线程的概念写一个Java程序(包括一个测试线程程序类TestThread,一个Thread类的子类PrintThread)。在测试程序中用子类PrintThread创建2个线程,使得其中一个线程运行时打印10次“线程1正在运行”,另一个线程运行时打印5次“线程2正在运行
源程序:
public class A
{
public static void main(String args[])
{
Test1 A1;
Test2 A2;
A1=new Test1();
A2=new Test2();
A1.start();
A2.start();
}
}
class PrintThread extends Thread
{
}
class Test1 extends PrintThread
{
public void run()
{
for(int i=1;i<=10;i++)
{
System.out.println("线程1正在运行!");
}
}
}
class Test2 extends PrintThread
{
public void run()
{
for(int i=1;i<=5;i++)
{
System.out.println("线程2正在运行!");
}
}
}
运行结果:
实验二:
将上述程序用Runnable接口改写,并上机验证源程序
public class D
{
}
class Move implements Runnable
{
线程1正在运行!");
线程2正在运行!");
运行结果:
实验三:
import java.awt.*;
import java.awt.event.*;
public class E
{ public static void main(String args[])
{ new FrameMoney();
}
}
class FrameMoney extends Frame
implements Runnable,ActionListener
{ int money=100;
TextArea text1,text2;
Thread 会计,出纳;
int weekDay;
Button start=new Button("开始演示");
FrameMoney()
{ 会计=new Thread(this);
出纳=new Thread(this);
text1=new TextArea(12,15);
text2=new TextArea(12,15);
setLayout(new FlowLayout());
add(start);
add(text1);
add(text2);
setVisible(true);
setSize(360,300);
validate();
addWindowListener(new WindowAdapter()
{ public void windowClosing(WindowEvent e)
{System.exit(0);
}
});
start.addActionListener(this);
}
public void actionPerformed(ActionEvent e)
{ if(!(出纳.isAlive()))
{ 会计=new Thread(this);
出纳=new Thread(this);
}
try
{ 会计.start();
出纳.start();
}
catch(Exception exp){}
}
public synchronized void 存取(int number) //存取方法
{ if(Thread.currentThread()==会计)
{ text1.append("今天是星期"+weekDay+"\\n");
for(int i=1;i<=3;i++) //会计使用存取方法存入90元,存入30元,稍歇一下
{ money=money+number; //这时出纳仍不能使用存取方法
try { Thread.sleep(1000); //因为会计还没使用完存取方法
}
catch(InterruptedException e){}
text1.append("帐上有"+money+"万\\n");
}
}
else if(Thread.currentThread()==出纳)
{ text2.append("今天是星期 "+weekDay+"\\n");
for(int i=1;i<=2;i++) //出纳使用存取方法取出30元,取出15元,稍歇一下
{ money=money-number/2; //这时会计仍不能使用存取方法
try { Thread.sleep(1000); //因为出纳还没使用完存取方法
}
catch(InterruptedException e){}
text2.append("帐上有"+money+"万\\n");
}
}
}
public void run()
{ if(Thread.currentThread()==会计||Thread.currentThread()==出纳)
{ for(int i=1;i<=3;i++) //从周一到周三会计和出纳都要使用帐本
{ weekDay=i;
存取(30);
}
}
}
}
运行结果:
}四、实验心得与小结
通过本次实验,基本了解了线程的概念,作用,方法以及使用规则。
1.首先:java 程序是建立在线程之上的。.
2.创建线程必须继承 Thread class 它已经为线程的创建和运行做了必要的配置。run是线程就重要的方法。你必须覆写这个方法达到你想要的目的。
3.run方法所包含的代码就是和其他线程同时运行的代码以达到同一时刻运行多段代码的目的。当终止了 run以后。这个线程也就结束了。调用线程的 start方法才会执行 run方法。
4.线程的生命周期:新建——Thread.State.NEW:当一个 Thread 类或者其子类的对象被声明并创建时,新的线程对象处于新建状态,此时它已经有了相应的内存空间和其他资源start方法尚未被调整用就绪可执行状态——Thread.State.RUNNABLE:处于新建状态的线程被启动后,将进入线程队列排队,这个时候具备了运行的条件,一旦轮到 CPU 的时候,就可以脱离创建它的主线程开始自己的生命周期运行:就绪的线程被调度进入运行状态,每一个 Thread 类及其子类的对象都有一个重要的run方法,当线程对象被调度执行的时候,它将自动调用本对象的 run方法,从第一句代码开始执行。