实验十二多线程

2024-04-29

实验十二多线程(精选2篇)

篇1:实验十二多线程

宁波工程学院电信学院计算机教研室

实验报告

课程名称: 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 { public static void main(String args[]){

Move move=new Move();

move.test1.start();

move.test2.start();} } class Move implements Runnable { Thread test1,test2;Move(){

test1=new Thread(this);

test1.setName(“线程1正在运行!”);

test2=new Thread(this);

test2.setName(“线程2正在运行!”);} public void run(){

if(Thread.currentThread()==test1)

{

for(int i=1;i<=10;i++)

{

System.out.println(test1.getName());

} } } else { for(int i=1;i<=5;i++){

System.out.println(test2.getName());} } 运行结果:

实验三:

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方法,从第一句代码开始执行。

篇2:实验十二多线程

当前流行的Windows操作系统能同时运行几个程序 (独立运行的程序又称之为进程) , 对于同一个程序, 它又可以分成若干个独立的执行流, 称之为线程, 线程提供了多任务处理的能力。用进程和线程的观点来研究操作系统是当今普遍采用的方法, 进程和线程的概念的出现, 对提高软件的并行性有着重要的意义。现在的大型应用软件无一不是多线程多任务处理, 单线程的软件是不可想象的。因此掌握多线程多任务设计方法对每个计算机专业的学生都是必需要掌握的。

1 实验内容设计

进程是应用程序的执行实例, 每个进程是由私有的虚拟地址空间、代码、数据和其它系统资源组成。进程在运行时创建的资源随着进程的终止而死亡。线程是一个独立的执行流, 是进程内部的一个独立的执行单元, 相当于一个子程序。单独一个执行程序运行时, 至少包含一个主线程, 主线程以函数地址的形式出现, 提供程序的启动点, 如Win Main () 函数或main () 等。当主线程终止时, 进程随之终止。应用程序可以分解成许多独立执行的线程, 每个线程并行运行在同一进程中。

进程中的所有线程都在该进程的虚拟地址空间中, 共同使用该进程的全局变量和系统资源。一个进程中的所有线程共享它们父进程的变量, 但同时每个线程可以拥有自己的变量。操作系统给每个线程分配不同的CPU时间片, 在某一个时刻, CPU只执行一个时间片内的线程, 多个时间片中的相应线程在CPU内轮流执行, 由于每个时间片时间很短, 所以对用户来说, 仿佛各个线程在计算机中是并行处理的。

在windows下用线程代替Linux的子进程, 实验通过调用函数_beginthreadex () 来编写多线程的程序, _beginthreadex () 函数的定义[2]:

2.1 线程的创建

对于工作线程来说, 启动一个线程, 首先需要编写一个应用程序的其余部分并行运行的函数如son () , 接着定义一个指向对象的指针变量*h Thread, 调用_beginthreadex () 函数, 返回值赋给h Thread变量的同时一并启动该线程来执行上面的son () 函数, 其中son是线程要运行的函数的名字, 也既是控制函数的名字。

编写一段程序, 使用系统调用_beginthreadex () 创建两个线程。当此程序运行时, 在系统中有一个父线程和两个子线程活动。让每一个线程在屏幕上显示一个字符串:父线程显示'father', 子线程分别显示'son'和'daughter', 因为线程的输出太快, 使我们很难看清楚, 可以使用函数Sleep () 来暂停线程的执行, 用Sleep (1000) 表示暂停1秒, 程序部分代码如下:

程序结果如图1所示, 从线程并发执行来看, 三个字符串的输出顺序是随机性。

2.2 线程的控制

对于一个资源被多个线程共用会导致程序的混乱, 解决方法是只允许一个线程拥有对共享资源的独占, 这样就能够解决上面的问题了。用函数Create Mutex () 创造一个独占资源来给每个线程加锁, 可以实现线程之间的互诉, 程序部分代码如下:

程序结果如图2所示, 三个线程顺序执行。

3 结束语

本文介绍了一个基于Windows的父子线程控制实验的内容设计, 对实验的关键代码进行了分析。实验效果表明本实验能够加深学生对操作系统多线程多任务的理解, 提高Windows系统下的编程能力, 从而进一步提高“操作系统原理”课程的教学效果。

参考文献

[1]张尧学.计算机操作系统教程 (第3版) 习题解答与实验指导[M].北京:清华大学出版社, 2006.

[2]冯红伟, 王鹏.操作系统教学与实验设计研究[J].实验室研究与探索, 2007 (12) :251-253.

上一篇:“归园田居(一)”教学反思下一篇:U900问题处理